This patch by David S. Miller. --- XFree86-4.1.0/xc/config/cf/linux.cf.~1~ Sun Jun 3 19:44:40 2001 +++ XFree86-4.1.0/xc/config/cf/linux.cf Sun Jun 3 19:44:48 2001 @@ -720,7 +720,7 @@ # endif # define LinuxMachineDefines -D__sparc__ # define ServerOSDefines XFree86ServerOSDefines -DDDXTIME -DPART_NET -# define ServerExtraDefines -DGCCUSESGAS XFree86ServerDefines +# define ServerExtraDefines -DHAVE_DOMAINS -DGCCUSESGAS XFree86ServerDefines # define AsVISOption -Av9a # ifdef Sparc64Architecture # define AsOutputArchSize 64 --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86.h.~1~ Sun Jun 3 19:44:40 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86.h Sun Jun 3 19:44:48 2001 @@ -121,10 +121,18 @@ resPtr xf86ReallocatePciResources(int entityIndex, resPtr pRes); resPtr xf86SetOperatingState(resList list, int entityIndex, int mask); void xf86EnterServerState(xf86State state); -resRange xf86GetBlock(long type, memType size, +resRange xf86GetBlock(long type, +#ifdef HAVE_DOMAINS + int domain, +#endif + memType size, memType window_start, memType window_end, memType align_mask, resPtr avoid); -resRange xf86GetSparse(long type, memType fixed_bits, +resRange xf86GetSparse(long type, +#ifdef HAVE_DOMAINS + int domain, +#endif + memType fixed_bits, memType decode_mask, memType address_mask, resPtr avoid); memType xf86ChkConflict(resRange *rgp, int entityIndex); --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86Bus.c.~1~ Sun Jun 3 19:44:40 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86Bus.c Sun Jun 3 19:44:48 2001 @@ -393,6 +393,9 @@ resPtr res = Acc; while (res) { + /* NOTE: Assumes that entities live inside of a single + * domain. + */ if (res->entityIndex == entityIndex && (type & ResAccMask & res->res_type)) { @@ -895,6 +898,14 @@ memType val,tmp,prev; int i; +#ifdef HAVE_DOMAINS + /* A resource cannot conflict with a range in a different + * domain. + */ + if (pRes->res_domain != range->domain) + return 0; +#endif + switch (pRes->res_type & ResExtMask) { case ResBlock: if (range->rBegin < pRes->block_end && @@ -953,6 +964,14 @@ memType val, tmp, prev; int i; +#ifdef HAVE_DOMAINS + /* A resource cannot conflict with a range in a different + * domain. + */ + if (pRes->res_domain != range->domain) + return 0; +#endif + switch (pRes->res_type & ResExtMask) { case ResSparse: tmp = pRes->sparse_mask & range->rMask; @@ -1020,7 +1039,7 @@ * depending on the types of the resource ranges and their locations */ static Bool -needCheck(resPtr pRes, long type, int entityIndex, xf86State state) +needCheck(resPtr pRes, long type, int domain, int entityIndex, xf86State state) { /* the same entity shouldn't conflict with itself */ ScrnInfoPtr pScrn; @@ -1031,6 +1050,14 @@ if (!(pRes->res_type & type & ResPhysMask)) return FALSE; +#ifdef HAVE_DOMAINS + /* A resource cannot conflict with something in a different + * domain. + */ + if (pRes->res_domain != domain) + return FALSE; +#endif + /* * Resources set by BIOS (ResBios) are allowed to conflict * with resources marked (ResBios). @@ -1111,7 +1138,11 @@ memType ret; while(pRes) { - if (!needCheck(pRes,rgp->type, entityIndex ,state)) { + int domain = 0; +#ifdef HAVE_DOMAINS + domain = rgp->domain; +#endif + if (!needCheck(pRes,rgp->type,domain,entityIndex,state)) { pRes = pRes->next; continue; } @@ -1274,16 +1305,20 @@ while (1) { while (list) { if ((list->res_type & ResPhysMask) == type) { + int domain = 0; +#ifdef HAVE_DOMAINS + domain = list->res_domain; +#endif switch (list->res_type & ResExtMask) { case ResBlock: - xf86ErrorFVerb(verb, "\t[%d] %d\t0x%08x - 0x%08x (0x%x)", - i, list->entityIndex, list->block_begin, + xf86ErrorFVerb(verb, "\t[%d] %d %x\t0x%08x - 0x%08x (0x%x)", + i, list->entityIndex, domain, list->block_begin, list->block_end, list->block_end - list->block_begin + 1); break; case ResSparse: - xf86ErrorFVerb(verb, "\t[%d] %d\t0x%08x - 0x%08x ", - i, list->entityIndex, + xf86ErrorFVerb(verb, "\t[%d] %d %x\t0x%08x - 0x%08x ", + i, list->entityIndex, domain, list->sparse_base,list->sparse_mask); break; default: @@ -1408,6 +1443,9 @@ if (pRes != target && ((pRes->res_type & ResPhysMask) == (target->res_type & ResPhysMask)) +#ifdef HAVE_DOMAINS + && pRes->res_domain == target->res_domain +#endif && pRes->block_begin <= target->block_end && pRes->block_end >= target->block_begin) { /* Possibly ignore estimated resources */ @@ -1460,12 +1498,16 @@ #define ALIGN(x,a) ((x) + a) &~(a) resRange -xf86GetBlock(long type, memType size, +xf86GetBlock(long type, +#ifdef HAVE_DOMAINS + int domain, +#endif + memType size, memType window_start, memType window_end, memType align_mask, resPtr avoid) { memType min, max, tmp; - resRange r = {ResEnd,0,0}; + resRange r = _END; resPtr res_range = ResRange; if (!size) return r; @@ -1478,7 +1520,11 @@ type = (type & ~(ResExtMask | ResBios | ResEstimated)) | ResBlock; while (res_range) { - if (type & res_range->res_type & ResPhysMask) { + if ((type & res_range->res_type & ResPhysMask) +#ifdef HAVE_DOMAINS + && (domain == res_range->res_domain) +#endif + ) { if (res_range->block_begin > window_start) min = res_range->block_begin; else @@ -1490,7 +1536,7 @@ min = ALIGN(min,align_mask); /* do not produce an overflow! */ while (min < max && (max - min) >= (size - 1)) { - RANGE(r,min,min + size - 1,type); + RANGE(r,min,min + size - 1,type,domain); tmp = ChkConflict(&r,Acc,SETUP); if (!tmp) { tmp = ChkConflict(&r,avoid,SETUP); @@ -1503,7 +1549,7 @@ } res_range = res_range->next; } - RANGE(r,0,0,ResEnd); + RANGE(r,0,0,ResEnd,domain); return r; } @@ -1557,10 +1603,14 @@ } resRange -xf86GetSparse(long type, memType fixed_bits, +xf86GetSparse(long type, +#ifdef HAVE_DOMAINS + int domain, +#endif + memType fixed_bits, memType decode_mask, memType address_mask, resPtr avoid) { - resRange r = {ResEnd,0,0}; + resRange r = _END; memType new_mask; memType mask1; memType base; @@ -1602,7 +1652,7 @@ */ while (1) { base = make_base(counter,new_mask) | fixed_bits; - RANGE(r,base,address_mask,type); + RANGE(r,base,address_mask,type,domain); conflict = ChkConflict(&r,Acc,SETUP); if (!conflict) { conflict = ChkConflict(&r,avoid,SETUP); @@ -1617,7 +1667,7 @@ if (counter > max_counter) break; } if (!new_mask && (new_mask == decode_mask)) { - RANGE(r,0,0,ResEnd); + RANGE(r,0,0,ResEnd,domain); return r; } /* @@ -1640,7 +1690,7 @@ counter1 = 0; while (1) { base = make_base(counter1,mask1); - RANGE(r,base,address_mask,type); + RANGE(r,base,address_mask,type,domain); conflict = ChkConflict(&r,Acc,SETUP); if (!conflict) { conflict = ChkConflict(&r,avoid,SETUP); @@ -1655,7 +1705,7 @@ counter ++; if (counter > max_counter) break; } - RANGE(r,0,0,ResEnd); + RANGE(r,0,0,ResEnd,domain); return r; } @@ -2686,6 +2736,9 @@ int i = 0; new.type = (range.type & ~ResExtMask) | ResSparse; +#ifdef HAVE_DOMAINS + new.domain = range.domain; +#endif while (1) { if (val & 0x01) { @@ -2726,7 +2779,11 @@ if (list1) { list = list1; - if (range.type & list->res_type & ResPhysMask) { + if ((range.type & list->res_type & ResPhysMask) +#ifdef HAVE_DOMAINS + && (range.domain == list->res_domain) +#endif + ) { switch (range.type & ResExtMask) { case ResBlock: if ((list->res_type & ResExtMask) == ResBlock) { @@ -2736,21 +2793,21 @@ else if (range.rBegin < list->block_begin && range.rEnd > list->block_end) { RANGE(range1, range.rBegin, list->block_begin - 1, - range.type); + range.type, range.domain); RANGE(range2, list->block_end + 1, range.rEnd, - range.type); + range.type, range.domain); return (x_isSubsetOf(range1,list->next,list2) && x_isSubsetOf(range2,list->next,list2)); } else if (range.rBegin >= list->block_begin && range.rBegin <= list->block_end) { RANGE(range1, list->block_end + 1, range.rEnd, - range.type); + range.type, range.domain); return (x_isSubsetOf(range1,list->next,list2)); } else if (range.rEnd >= list->block_begin && range.rEnd <= list->block_end) { RANGE(range1,range.rBegin, list->block_begin - 1, - range.type); + range.type, range.domain); return (x_isSubsetOf(range1,list->next,list2)); } } @@ -2791,7 +2848,7 @@ | ((~list->sparse_base & list->sparse_mask) & ~range.rMask)) & range1.rMask, ((range.rMask | list->sparse_mask) & ~test) - | (1 << i), range.type); + | (1 << i), range.type, range.domain); return (x_isSubsetOf(range1,list->next,list2)); } } @@ -2885,7 +2942,11 @@ resPtr new = NULL; while (list) { - if (Range.type & list->res_type & ResPhysMask) { + if ((Range.type & list->res_type & ResPhysMask) +#ifdef HAVE_DOMAINS + && (Range.domain == list->res_domain) +#endif + ) { switch (Range.type & ResExtMask) { case ResBlock: switch (list->res_type & ResExtMask) { @@ -2900,6 +2961,9 @@ range.rEnd = list->block_end; if (range.rEnd > range.rBegin) { range.type = Range.type; +#ifdef HAVE_DOMAINS + range.domain = Range.domain; +#endif new = xf86AddResToList(new,&range,-1); } break; @@ -2917,7 +2981,7 @@ | (~range.rMask & list->sparse_base) | (~list->sparse_mask & range.rBase), range.rMask | list->sparse_mask, - Range.type); + Range.type, Range.domain); new = xf86AddResToList(new,&range,-1); } break; @@ -2956,11 +3020,11 @@ switch (Range.type & ResExtMask) { case ResBlock: if (Range.rBegin > 0) { - RANGE(range, 0, Range.rBegin - 1, Range.type); + RANGE(range, 0, Range.rBegin - 1, Range.type,Range.domain); new = xf86AddResToList(new,&range,-1); } if (Range.rEnd < (memType)~0) { - RANGE(range,Range.rEnd + 1, (memType)~0, Range.type); + RANGE(range,Range.rEnd + 1, (memType)~0, Range.type, Range.domain); new = xf86AddResToList(new,&range,-1); } break; @@ -2968,7 +3032,7 @@ tmp = Range.rMask; for (i = 0; i < sizeof(memType); i++) { if (tmp & 0x1) { - RANGE(range,(~Range.rMask & range.rMask),(1 << i), Range.type); + RANGE(range,(~Range.rMask & range.rMask),(1 << i), Range.type, Range.domain); new = xf86AddResToList(new,&range,-1); } } @@ -2991,6 +3055,21 @@ } return ret; } + +#ifdef HAVE_DOMAINS +resPtr +xf86ExtractDomainFromList(resPtr list, unsigned int domain) +{ + resPtr ret = NULL; + + while (list) { + if (list->res_domain == domain) + ret = xf86AddResToList(ret,&(list->val),list->entityIndex); + list = list->next; + } + return ret; +} +#endif /*------------------------------------------------------------*/ static void CheckGenericGA(void); --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86Bus.h.~1~ Sun Jun 3 19:44:40 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86Bus.h Sun Jun 3 19:44:48 2001 @@ -123,6 +123,9 @@ Bool xf86IsSubsetOf(resRange range, resPtr list); Bool xf86IsListSubsetOf(resPtr list, resPtr BaseList); resPtr xf86ExtractTypeFromList(resPtr list, unsigned long type); +#ifdef HAVE_DOMAINS +resPtr xf86ExtractDomainFromList(resPtr list, unsigned int domain); +#endif resPtr findIntersect(resRange Range, resPtr list); resPtr xf86FindIntersect(resRange Range, resPtr list); void RemoveOverlaps(resPtr target, resPtr list, Bool pow2Alignment, --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86Resources.h~ Tue Jul 31 23:17:31 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86Resources.h Tue Jul 31 23:17:33 2001 @@ -6,78 +6,84 @@ #include "xf86str.h" -#define _END {ResEnd,0,0} +#ifdef HAVE_DOMAINS +#define DEFAULT_DOMAIN 0, +#else +#define DEFAULT_DOMAIN /**/ +#endif + +#define _END {ResEnd, DEFAULT_DOMAIN 0,0} #define _VGA_EXCLUSIVE \ - {ResExcMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResExcMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResExcMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF},\ - {ResExcIoBlock | ResBios | ResBus, 0x03B0, 0x03BB},\ - {ResExcIoBlock | ResBios | ResBus, 0x03C0, 0x03DF} + {ResExcMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResExcMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResExcMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF},\ + {ResExcIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03BB},\ + {ResExcIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03DF} #define _VGA_SHARED \ - {ResShrMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResShrMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResShrMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF},\ - {ResShrIoBlock | ResBios | ResBus, 0x03B0, 0x03BB},\ - {ResShrIoBlock | ResBios | ResBus, 0x03C0, 0x03DF} + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF},\ + {ResShrIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03BB},\ + {ResShrIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03DF} #define _VGA_SHARED_MEM \ - {ResShrMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResShrMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResShrMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF} + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF} #define _VGA_SHARED_IO \ - {ResShrIoBlock | ResBios | ResBus, 0x03B0, 0x03BB},\ - {ResShrIoBlock | ResBios | ResBus, 0x03C0, 0x03DF} + {ResShrIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03BB},\ + {ResShrIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03DF} /* * Exclusive unused VGA: resources unneeded but cannot be disabled. * Like old Millennium. */ #define _VGA_EXCLUSIVE_UNUSED \ - {ResExcUusdMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResExcUusdMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResExcUusdMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF},\ - {ResExcUusdIoBlock | ResBios | ResBus, 0x03B0, 0x03BB},\ - {ResExcUusdIoBlock | ResBios | ResBus, 0x03C0, 0x03DF} + {ResExcUusdMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResExcUusdMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResExcUusdMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF},\ + {ResExcUusdIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03BB},\ + {ResExcUusdIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03DF} /* * Shared unused VGA: resources unneeded but cannot be disabled * independently. This is used to determine if a device needs RAC. */ #define _VGA_SHARED_UNUSED \ - {ResShrUusdMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResShrUusdMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResShrUusdMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF},\ - {ResShrUusdIoBlock | ResBios | ResBus, 0x03B0, 0x03BB},\ - {ResShrUusdIoBlock | ResBios | ResBus, 0x03C0, 0x03DF} + {ResShrUusdMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResShrUusdMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResShrUusdMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF},\ + {ResShrUusdIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03BB},\ + {ResShrUusdIoBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03DF} /* * Sparse versions of the above for those adapters that respond to all ISA * aliases of VGA ports. */ #define _VGA_EXCLUSIVE_SPARSE \ - {ResExcMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResExcMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResExcMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF},\ - {ResExcIoSparse | ResBios | ResBus, 0x03B0, 0x03F8},\ - {ResExcIoSparse | ResBios | ResBus, 0x03B8, 0x03FC},\ - {ResExcIoSparse | ResBios | ResBus, 0x03C0, 0x03E0} + {ResExcMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResExcMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResExcMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF},\ + {ResExcIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03F8},\ + {ResExcIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x03B8, 0x03FC},\ + {ResExcIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03E0} #define _VGA_SHARED_SPARSE \ - {ResShrMemBlock | ResBios | ResBus, 0x000A0000, 0x000AFFFF},\ - {ResShrMemBlock | ResBios | ResBus, 0x000B0000, 0x000B7FFF},\ - {ResShrMemBlock | ResBios | ResBus, 0x000B8000, 0x000BFFFF},\ - {ResShrIoSparse | ResBios | ResBus, 0x03B0, 0x03F8},\ - {ResShrIoSparse | ResBios | ResBus, 0x03B8, 0x03FC},\ - {ResShrIoSparse | ResBios | ResBus, 0x03C0, 0x03E0} + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000A0000, 0x000AFFFF},\ + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B0000, 0x000B7FFF},\ + {ResShrMemBlock | ResBios | ResBus, DEFAULT_DOMAIN 0x000B8000, 0x000BFFFF},\ + {ResShrIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x03B0, 0x03F8},\ + {ResShrIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x03B8, 0x03FC},\ + {ResShrIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x03C0, 0x03E0} #define _8514_EXCLUSIVE \ - {ResExcIoSparse | ResBios | ResBus, 0x02E8, 0x03F8} + {ResExcIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x02E8, 0x03F8} #define _8514_SHARED \ - {ResShrIoSparse | ResBios | ResBus, 0x02E8, 0x03F8} + {ResShrIoSparse | ResBios | ResBus, DEFAULT_DOMAIN 0x02E8, 0x03F8} /* predefined resources */ extern resRange resVgaExclusive[]; @@ -102,9 +108,9 @@ #define RES_SHARED_8514 res8514Shared #define _PCI_AVOID_PC_STYLE \ - {ResExcIoSparse | ResBus, 0x0100, 0x0300},\ - {ResExcIoSparse | ResBus, 0x0200, 0x0200},\ - {ResExcMemBlock | ResBus, 0xA0000,0xFFFFF} + {ResExcIoSparse | ResBus, DEFAULT_DOMAIN 0x0100, 0x0300},\ + {ResExcIoSparse | ResBus, DEFAULT_DOMAIN 0x0200, 0x0200},\ + {ResExcMemBlock | ResBus, DEFAULT_DOMAIN 0xA0000,0xFFFFF} extern resRange PciAvoid[]; --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c.~1~ Sun Jun 3 19:44:40 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c Sun Jun 3 19:44:48 2001 @@ -91,9 +91,9 @@ ? pciBusAddrToHostAddr(tag,PCI_MEM_SIZE,size) \ : pciBusAddrToHostAddr(tag,PCI_IO_SIZE,size)) #define PCI_M_RANGE(range,tag,begin,end,type) \ - { RANGE(range,B2M(tag,begin),B2M(tag,end),type); } + { RANGE(range,B2M(tag,begin),B2M(tag,end),type,xf86GetPciDomain(tag)); } #define PCI_I_RANGE(range,tag,begin,end,type) \ - { RANGE(range,B2I(tag,begin),B2I(tag,end),type); } + { RANGE(range,B2I(tag,begin),B2I(tag,end),type,xf86GetPciDomain(tag)); } #define PCI_X_RANGE(range,tag,begin,end,type) \ { if (type & ResMem) PCI_M_RANGE(range,tag,begin,end,type); \ else PCI_I_RANGE(range,tag,begin,end,type); } @@ -1039,9 +1039,15 @@ PciBusPtr pbp = xf86PciBus, pbp1 = xf86PciBus; pciConfigPtr pcp; resPtr tmp; +#ifdef HAVE_DOMAINS + int domain; +#endif if (!pvp) return FALSE; tag = pciTag(pvp->bus,pvp->device,pvp->func); +#ifdef HAVE_DOMAINS + domain = xf86GetPciDomain(tag); +#endif pcp = pvp->thisCard; type &= ResAccMask; @@ -1232,12 +1238,20 @@ #endif w_tmp = w; while (w) { - if (type & w->res_type & ResPhysMask) { + if ((type & w->res_type & ResPhysMask) +#ifdef HAVE_DOMAINS + && (domain == w->res_domain) +#endif + ) { #ifdef DEBUG ErrorF("block_begin: 0x%lx block_end: 0x%lx\n",w->block_begin, w->block_end); #endif - range = xf86GetBlock(type,PCI_SIZE(type,tag,alignment + 1), + range = xf86GetBlock(type, +#ifdef HAVE_DOMAINS + domain, +#endif + PCI_SIZE(type,tag,alignment + 1), w->block_begin, w->block_end, PCI_SIZE(type,tag,alignment),avoid); if (range.type != ResEnd) @@ -1250,12 +1264,20 @@ if (range.type == ResEnd && w_2nd) { w_tmp = w_2nd; while (w_2nd) { - if (type & w_2nd->res_type & ResPhysMask) { + if ((type & w_2nd->res_type & ResPhysMask) +#ifdef HAVE_DOMAINS + && (domain == w_2nd->res_domain) +#endif + ) { #ifdef DEBUG ErrorF("block_begin: 0x%lx block_end: 0x%lx\n",w_2nd->block_begin, w_2nd->block_end); #endif - range = xf86GetBlock(type,PCI_SIZE(type,tag,alignment + 1), + range = xf86GetBlock(type, +#ifdef HAVE_DOMAINS + domain, +#endif + PCI_SIZE(type,tag,alignment + 1), w_2nd->block_begin, w_2nd->block_end, PCI_SIZE(type,tag,alignment),avoid); if (range.type != ResEnd) @@ -1323,7 +1345,7 @@ Bool xf86FixPciResource(int entityIndex, int prt, memType alignment, - long type) + long type) { pciVideoPtr pvp = xf86GetPciInfoForEntity(entityIndex); return fixPciResource(prt, alignment, pvp, type); @@ -1481,6 +1503,9 @@ */ while (m) { range = xf86GetBlock(ResExcMemBlock, +#ifdef HAVE_DOMAINS + xf86GetPciDomain(TAG(pvp)), +#endif PCI_SIZE(ResMem, TAG(pvp), 1 << biosSize), m->block_begin, m->block_end, PCI_SIZE(ResMem, TAG(pvp), alignment), @@ -1730,10 +1755,9 @@ PciBusPtr *pnPciBus = &PciBusBase; int MaxBus = 0; int i; + int domain = 0; memType base, limit; - resPtr pciBusAccWindows = xf86PciBusAccWindowsFromOS(); - if (pciInfo == NULL) return NULL; /* Add each PCI-PCI bridge */ @@ -1856,13 +1880,25 @@ PciBus->secondary = -1; /* to be set below */ PciBus->subclass = sub_class; PciBus->brcontrol = PCI_PCI_BRIDGE_VGA_EN; +#ifdef HAVE_DOMAINS + domain = xf86GetPciDomain(pcrp->tag); +#endif + /* XXX A memory leak has returned here... -DaveM */ PciBus->preferred_io = xf86ExtractTypeFromList( - pciBusAccWindows,ResIo); + xf86PciBusAccWindowsFromOS(domain),ResIo); PciBus->preferred_mem = xf86ExtractTypeFromList( - pciBusAccWindows,ResMem); + xf86PciBusAccWindowsFromOS(domain),ResMem); PciBus->preferred_pmem = xf86ExtractTypeFromList( - pciBusAccWindows,ResMem); + xf86PciBusAccWindowsFromOS(domain),ResMem); xf86MsgVerb(X_INFO,3,"Host-to-PCI bridge:\n"); +#ifdef DEBUG + xf86MsgVerb(X_INFO,3,"Preferred I/O:\n"); + xf86PrintResList(3,PciBus->preferred_io); + xf86MsgVerb(X_INFO,3,"Preferred MEM:\n"); + xf86PrintResList(3,PciBus->preferred_mem); + xf86MsgVerb(X_INFO,3,"Preferred Prefetchable MEM:\n"); + xf86PrintResList(3,PciBus->preferred_pmem); +#endif break; default: break; @@ -1892,12 +1928,23 @@ PciBus->primary = -1; PciBus->secondary = i; PciBus->subclass = PCI_SUBCLASS_BRIDGE_HOST; + +#ifdef HAVE_DOMAINS + /* Find a device on this bus. */ + for (pcrpp = pciInfo, pcrp = *pcrpp; pcrp; pcrp = *(++pcrpp)) { + if (pcrp->busnum == i) + break; + } + + if (pcrp) domain = xf86GetPciDomain(pcrp->tag); +#endif + /* XXX A memory leak has returned here... -DaveM */ PciBus->preferred_io = xf86ExtractTypeFromList( - pciBusAccWindows,ResIo); + xf86PciBusAccWindowsFromOS(domain),ResIo); PciBus->preferred_mem = xf86ExtractTypeFromList( - pciBusAccWindows,ResMem); + xf86PciBusAccWindowsFromOS(domain),ResMem); PciBus->preferred_pmem = xf86ExtractTypeFromList( - pciBusAccWindows,ResMem); + xf86PciBusAccWindowsFromOS(domain),ResMem); xf86MsgVerb(X_INFO,3,"Host-to-PCI bridge:\n"); } } @@ -1928,7 +1975,6 @@ printBridgeInfo(PciBus); } - xf86FreeResList(pciBusAccWindows); return PciBusBase; } --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86str.h.~1~ Sun Jun 3 19:44:40 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/common/xf86str.h Sun Jun 3 19:44:48 2001 @@ -593,15 +593,27 @@ typedef struct { long type; /* shared, exclusive, unused etc. */ +#ifdef HAVE_DOMAINS + unsigned int domain; +#endif memType a; memType b; } resRange, *resList; -#define RANGE(r,u,v,t) {\ +#ifdef HAVE_DOMAINS +#define RANGE(r,u,v,t,d) {\ (r).a = (u);\ (r).b = (v);\ (r).type = t;\ + (r).domain = d;\ } +#else +#define RANGE(r,u,v,t,d) {\ + (r).a = (u);\ + (r).b = (v);\ + (r).type = t;\ + } +#endif #define rBase a #define rMask b @@ -621,6 +633,9 @@ #define block_begin val.rBegin #define block_end val.rEnd #define res_type val.type +#ifdef HAVE_DOMAINS +#define res_domain val.domain +#endif typedef struct { int numChipset; --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/drivers/ati/Imakefile Sun Jun 3 19:44:48 2001 @@ -87,12 +87,12 @@ # ifndef ATIAvoidCPIO # define ATIAvoidCPIO NO # endif -#elif defined(SparcArchitecture) || 1 +#elif 1 # undef ATIAvoidCPIO /* Clobber any previous setting */ # define ATIAvoidCPIO YES #endif -#if defined(PpcArchitecture) +#if defined(PpcArchitecture) || defined(SparcArchitecture) # undef ATIAvoidNonPCI # define ATIAvoidNonPCI YES #elif !defined(ATIAvoidNonPCI) --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/drivers/ati/aticonfig.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/drivers/ati/aticonfig.c Sun Jun 3 19:44:48 2001 @@ -27,6 +27,7 @@ #include "aticursor.h" #include "atioption.h" #include "atistruct.h" +#include "atichip.h" /* * Non-publicised XF86Config options. @@ -122,6 +123,11 @@ } ReferenceClock = ((double)157500000.0) / ((double)11.0); +#ifdef __sparc__ + if (pATI->Chip == ATI_CHIP_264XL) + ReferenceClock = ((double)315000000.0) / ((double)11.0); + CSync = TRUE; +#endif #ifndef AVOID_CPIO --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64.c Sun Jun 3 19:44:48 2001 @@ -1602,6 +1602,24 @@ */ switch (iDWord) { +#if X_BYTE_ORDER == X_BIG_ENDIAN + case 0: xf86WriteMmio32Be(pDst + 0, 0, *(pSrc + 0)); + case 1: xf86WriteMmio32Be(pDst + 1, 0, *(pSrc + 1)); + case 2: xf86WriteMmio32Be(pDst + 2, 0, *(pSrc + 2)); + case 3: xf86WriteMmio32Be(pDst + 3, 0, *(pSrc + 3)); + case 4: xf86WriteMmio32Be(pDst + 4, 0, *(pSrc + 4)); + case 5: xf86WriteMmio32Be(pDst + 5, 0, *(pSrc + 5)); + case 6: xf86WriteMmio32Be(pDst + 6, 0, *(pSrc + 6)); + case 7: xf86WriteMmio32Be(pDst + 7, 0, *(pSrc + 7)); + case 8: xf86WriteMmio32Be(pDst + 8, 0, *(pSrc + 8)); + case 9: xf86WriteMmio32Be(pDst + 9, 0, *(pSrc + 9)); + case 10: xf86WriteMmio32Be(pDst + 10, 0, *(pSrc + 10)); + case 11: xf86WriteMmio32Be(pDst + 11, 0, *(pSrc + 11)); + case 12: xf86WriteMmio32Be(pDst + 12, 0, *(pSrc + 12)); + case 13: xf86WriteMmio32Be(pDst + 13, 0, *(pSrc + 13)); + case 14: xf86WriteMmio32Be(pDst + 14, 0, *(pSrc + 14)); + case 15: xf86WriteMmio32Be(pDst + 15, 0, *(pSrc + 15)); +#else case 0: MMIO_OUT32(pDst + 0, 0, *(pSrc + 0)); case 1: MMIO_OUT32(pDst + 1, 0, *(pSrc + 1)); case 2: MMIO_OUT32(pDst + 2, 0, *(pSrc + 2)); @@ -1618,6 +1636,7 @@ case 13: MMIO_OUT32(pDst + 13, 0, *(pSrc + 13)); case 14: MMIO_OUT32(pDst + 14, 0, *(pSrc + 14)); case 15: MMIO_OUT32(pDst + 15, 0, *(pSrc + 15)); +#endif default: /* Muffle compiler */ break; --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bsd/bsdResource.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bsd/bsdResource.c Sun Jun 3 19:44:48 2001 @@ -17,22 +17,34 @@ resRange PciAvoid[] = {_PCI_AVOID_PC_STYLE, _END}; +#define MIN_SYSTEM_DOMAIN 0 +#ifdef HAVE_DOMAINS +#define MAX_SYSTEM_DOMAIN 255 +#else +#define MAX_SYSTEM_DOMAIN 0 +#endif +#define ISA_SYSTEM_DOMAIN 0 + resPtr xf86BusAccWindowsFromOS(void) { resPtr ret = NULL; resRange range; + int domain; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); - ret = xf86AddResToList(ret, &range, -1); + for (domain = MIN_SYSTEM_DOMAIN; domain <= MAX_SYSTEM_DOMAIN; domain++) { + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + + RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + } - RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock); - ret = xf86AddResToList(ret, &range, -1); return ret; } resPtr -xf86PciBusAccWindowsFromOS(void) +xf86PciBusAccWindowsFromOS(int domain) { resPtr ret = NULL; resRange range; @@ -44,10 +56,10 @@ * region 0x40000000-0xbfffffff for DMA but this only matters if * the bios screws up the pci region mappings. */ - RANGE(range, 0x80000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x80000000, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -58,10 +70,10 @@ resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -70,6 +82,14 @@ xf86AccResFromOS(resPtr ret) { resRange range; +#ifdef HAVE_DOMAINS + int domain = MIN_SYSTEM_DOMAIN; +#endif + +#ifdef HAVE_DOMAINS + if (ret != NULL) + domain = ret->res_domain; +#endif /* * Fallback is to claim the following areas: @@ -77,7 +97,7 @@ * 0x000c0000 - 0x000effff location of VGA and other extensions ROMS */ - RANGE(range, 0x000c0000, 0x000effff, ResExcMemBlock); + RANGE(range, 0x000c0000, 0x000effff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); /* @@ -85,20 +105,20 @@ * along with their sparse I/O aliases, but that's too imprecise. Instead * claim a bare minimum here. */ - RANGE(range, 0x00000000, 0x000000ff, ResExcIoBlock); /* For mainboard */ + RANGE(range, 0x00000000, 0x000000ff, ResExcIoBlock, domain); /* For mainboard */ ret = xf86AddResToList(ret, &range, -1); /* * At minimum, the top and bottom resources must be claimed, so that * resources that are (or appear to be) unallocated can be relocated. */ - RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock); + RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock); + RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); -/* RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock); +/* RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); */ - RANGE(range, 0xffffffff, 0xffffffff, ResExcIoBlock); + RANGE(range, 0xffffffff, 0xffffffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); /* XXX add others */ @@ -109,30 +129,38 @@ resRange PciAvoid[] = {_PCI_AVOID_PC_STYLE, _END}; +#define MIN_SYSTEM_DOMAIN 0 +#define MAX_SYSTEM_DOMAIN 0 +#define ISA_SYSTEM_DOMAIN 0 + resPtr xf86BusAccWindowsFromOS(void) { resPtr ret = NULL; resRange range; + int domain; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); - ret = xf86AddResToList(ret, &range, -1); + for (domain = MIN_SYSTEM_DOMAIN; domain <= MAX_SYSTEM_DOMAIN; domain++) { + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + } - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); - ret = xf86AddResToList(ret, &range, -1); return ret; } resPtr -xf86PciBusAccWindowsFromOS(void) +xf86PciBusAccWindowsFromOS(int domain) { resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); return ret; } --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/Imakefile.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/Imakefile Sun Jun 3 19:44:48 2001 @@ -14,8 +14,16 @@ PCIDRVRSRC = axpPci.c PCIDRVROBJ = axpPci.o -#elif (defined(LinuxArchitecture) || defined(SunArchitecture)) && \ - defined(SparcArchitecture) +#elif defined(LinuxArchitecture) && defined(SparcArchitecture) + +XCOMM Sparc SBUS driver, generic linux PCI driver + +PCIDRVRSRC = linuxPci.c +PCIDRVROBJ = linuxPci.o +SBUSDRVSRC = Sbus.c +SBUSDRVOBJ = Sbus.o + +#elif defined(SunArchitecture) && defined(SparcArchitecture) XCOMM Sparc PCI driver --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.c Sun Jun 3 19:44:48 2001 @@ -1015,6 +1015,13 @@ #if defined(INCLUDE_XF86_MAP_PCI_MEM) +#ifdef HAVE_DOMAINS +int xf86GetPciDomain(PCITAG Tag) +{ + return 0; +} +#endif + pointer xf86MapPciMem(int ScreenNum, int Flags, PCITAG Tag, ADDRESS Base, unsigned long Size) --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.h.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/Pci.h Sun Jun 3 19:44:48 2001 @@ -152,9 +152,11 @@ # if !defined(PowerMAX_OS) # define INCLUDE_XF86_MAP_PCI_MEM # endif -#elif defined(__sparc__) && (defined(linux) || defined(sun)) +#elif defined(__sparc__) && defined(sun) # define ARCH_PCI_INIT sparcPciInit # define INCLUDE_XF86_MAP_PCI_MEM +#elif defined(__sparc__) && defined(linux) +# define ARCH_PCI_INIT linuxPciInit #elif defined(__alpha__) && defined(linux) # define ARCH_PCI_INIT axpPciInit # define INCLUDE_XF86_MAP_PCI_MEM --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxPci.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxPci.c Sun Jun 3 19:44:48 2001 @@ -88,6 +88,13 @@ #define PCI_CPU(val) (val) #endif +/* Ioctls for /proc/bus/pci/X/Y nodes. */ +#define PCIIOC_BASE ('P' << 24 | 'C' << 16 | 'I' << 8) +#define PCIIOC_CONTROLLER (PCIIOC_BASE | 0x00) /* Get controller for PCI device. */ +#define PCIIOC_MMAP_IS_IO (PCIIOC_BASE | 0x01) /* Set mmap state to I/O space. */ +#define PCIIOC_MMAP_IS_MEM (PCIIOC_BASE | 0x02) /* Set mmap state to MEM space. */ +#define PCIIOC_WRITE_COMBINE (PCIIOC_BASE | 0x03) /* Enable/disable write-combining. */ + void linuxPciInit() { @@ -167,3 +174,129 @@ write(fd,&val,4); } } + +#ifndef INCLUDE_XF86_MAP_PCI_MEM + +#ifdef HAVE_DOMAINS +int xf86GetPciDomain(PCITAG Tag) +{ + int fd; + + if (-1 != (fd = linuxPciOpenFile(Tag))) { + int err = ioctl(fd, PCIIOC_CONTROLLER, 0); + + if (err < 0) + return 0; + + return err; + } + + return 0; +} +#endif + +static pointer +xf86MapPciGeneric(int ScreenNum, int Flags, PCITAG Tag, ADDRESS Base, + unsigned long Size, int io_space) +{ + int fd; + + xf86InitVidMem(); + + if (-1 != (fd = linuxPciOpenFile(Tag))) { + ADDRESS realBase, alignOff; + pointer p; + CARD32 save = 0; + int err, mapflags; + + if (io_space) + err = ioctl(fd, PCIIOC_MMAP_IS_IO, 0); + else + err = ioctl(fd, PCIIOC_MMAP_IS_MEM, 0); + + if (err < 0) + goto fail; + + if (Flags & VIDMEM_READSIDEEFFECT) { + save = pciReadLong(Tag, PCI_CMD_STAT_REG); + pciWriteLong(Tag, PCI_CMD_STAT_REG, + save & ~PCI_CMD_MEM_ENABLE); + } + + mapflags = MAP_SHARED; +#if defined(__ia64__) +#ifndef MAP_WRITECOMBINED +#define MAP_WRITECOMBINED 0x00010000 +#endif +#ifndef MAP_NONCACHED +#define MAP_NONCACHED 0x00020000 +#endif + if (Flags & VIDMEM_FRAMEBUFFER) + mapflags |= MAP_WRITECOMBINED; + else + mapflags |= MAP_NONCACHED; +#else /* !(__ia64__) */ + err = ioctl(fd, PCIIOC_WRITE_COMBINE, + (Flags & VIDMEM_FRAMEBUFFER) ? 1 : 0); + if (err < 0) + goto fail_restore_cmd_stat; +#endif + + realBase = Base & ~(getpagesize() - 1); + alignOff = Base - realBase; + + p = mmap(NULL, Size + alignOff, PROT_READ | PROT_WRITE, + mapflags, fd, realBase); + + if (!p || p == (pointer) -1) { + FatalError("xf86MapPciMem: Could not mmap PCI memory " + "[base=0x%x,size=%x] (%s)\n", + Base, Size, strerror(errno)); + goto fail_restore_cmd_stat; + } + + if (Flags & VIDMEM_READSIDEEFFECT) { + xf86MapReadSideEffects(ScreenNum, Flags, p, Size); + pciWriteLong(Tag, PCI_CMD_STAT_REG, save); + } + + xf86MakeNewMapping(ScreenNum, Flags, Base, Size, p); + + return (pointer) ((char *)p + alignOff); + + fail_restore_cmd_stat: + if (Flags & VIDMEM_READSIDEEFFECT) + pciWriteLong(Tag, PCI_CMD_STAT_REG, save); + + return NULL; + } + +fail: + return NULL; +} + +pointer +xf86MapPciMem(int ScreenNum, int Flags, PCITAG Tag, ADDRESS Base, + unsigned long Size) +{ + return xf86MapPciGeneric(ScreenNum, Flags, Tag, + Base, Size, 0); +} + +pointer +xf86MapPciIo(int ScreenNum, int Flags, PCITAG Tag, ADDRESS Base, + unsigned long Size) +{ + return xf86MapPciGeneric(ScreenNum, Flags, Tag, + Base, Size, 1); +} + +int +xf86ReadPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, + unsigned char *Buf, int Len) +{ + xf86Msg(X_WARNING, "xf86ReadPciBIOS: Unsupported on this platform.\n"); + return -1; +} + +#endif /* !(INCLUDE_XF86_MAP_PCI_MEM) */ --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/bus/xf86Pci.h Sun Jun 3 19:44:48 2001 @@ -647,6 +647,9 @@ ADDRESS Base, unsigned long Size); int xf86ReadPciBIOS(unsigned long Offset, PCITAG Tag, int basereg, unsigned char *Buf, int Len); +#ifdef HAVE_DOMAINS +int xf86GetPciDomain(PCITAG Tag); +#endif pciConfigPtr *xf86scanpci(int flags); /* Old sytle PCI access functions (for compatibility) */ --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/linux/lnxResource.c Sun Jun 3 19:44:48 2001 @@ -15,22 +15,33 @@ #ifdef __alpha__ resRange PciAvoid[] = {_PCI_AVOID_PC_STYLE, _END}; +#define MIN_SYSTEM_DOMAIN 0 +#ifdef HAVE_DOMAINS +#define MAX_SYSTEM_DOMAIN 255 +#else +#define MAX_SYSTEM_DOMAIN 0 +#endif +#define ISA_SYSTEM_DOMAIN 0 + resPtr xf86BusAccWindowsFromOS(void) { resPtr ret = NULL; resRange range; + int domain; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); - ret = xf86AddResToList(ret, &range, -1); + for (domain = MIN_SYSTEM_DOMAIN; domain <= MAX_SYSTEM_DOMAIN; domain++) { + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); + ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock); - ret = xf86AddResToList(ret, &range, -1); + RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + } return ret; } resPtr -xf86PciBusAccWindowsFromOS(void) +xf86PciBusAccWindowsFromOS(int domain) { resPtr ret = NULL; resRange range; @@ -39,75 +50,75 @@ * sparse address space are an image of the ISA bus range */ if (_bus_base_sparse()) { - RANGE(range, 0x00000000, 0x07ffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0x07ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x09000000, 0x0fffffff, ResExcMemBlock); + RANGE(range, 0x09000000, 0x0fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x11000000, 0x17ffffff, ResExcMemBlock); + RANGE(range, 0x11000000, 0x17ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x19000000, 0x1fffffff, ResExcMemBlock); + RANGE(range, 0x19000000, 0x1fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x21000000, 0x27ffffff, ResExcMemBlock); + RANGE(range, 0x21000000, 0x27ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x29000000, 0x2fffffff, ResExcMemBlock); + RANGE(range, 0x29000000, 0x2fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x31000000, 0x37ffffff, ResExcMemBlock); + RANGE(range, 0x31000000, 0x37ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x39000000, 0x3fffffff, ResExcMemBlock); + RANGE(range, 0x39000000, 0x3fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x41000000, 0x47ffffff, ResExcMemBlock); + RANGE(range, 0x41000000, 0x47ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x49000000, 0x4fffffff, ResExcMemBlock); + RANGE(range, 0x49000000, 0x4fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x51000000, 0x57ffffff, ResExcMemBlock); + RANGE(range, 0x51000000, 0x57ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x59000000, 0x5fffffff, ResExcMemBlock); + RANGE(range, 0x59000000, 0x5fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x61000000, 0x67ffffff, ResExcMemBlock); + RANGE(range, 0x61000000, 0x67ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x69000000, 0x6fffffff, ResExcMemBlock); + RANGE(range, 0x69000000, 0x6fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x71000000, 0x77ffffff, ResExcMemBlock); + RANGE(range, 0x71000000, 0x77ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x79000000, 0x7fffffff, ResExcMemBlock); + RANGE(range, 0x79000000, 0x7fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x81000000, 0x87ffffff, ResExcMemBlock); + RANGE(range, 0x81000000, 0x87ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x89000000, 0x8fffffff, ResExcMemBlock); + RANGE(range, 0x89000000, 0x8fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x91000000, 0x97ffffff, ResExcMemBlock); + RANGE(range, 0x91000000, 0x97ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x99000000, 0x9fffffff, ResExcMemBlock); + RANGE(range, 0x99000000, 0x9fffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xa1000000, 0xa7ffffff, ResExcMemBlock); + RANGE(range, 0xa1000000, 0xa7ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xa9000000, 0xafffffff, ResExcMemBlock); + RANGE(range, 0xa9000000, 0xafffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xb1000000, 0xb7ffffff, ResExcMemBlock); + RANGE(range, 0xb1000000, 0xb7ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xb9000000, 0xbfffffff, ResExcMemBlock); + RANGE(range, 0xb9000000, 0xbfffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xc1000000, 0xc7ffffff, ResExcMemBlock); + RANGE(range, 0xc1000000, 0xc7ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xc9000000, 0xcfffffff, ResExcMemBlock); + RANGE(range, 0xc9000000, 0xcfffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xd1000000, 0xd7ffffff, ResExcMemBlock); + RANGE(range, 0xd1000000, 0xd7ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xd9000000, 0xdfffffff, ResExcMemBlock); + RANGE(range, 0xd9000000, 0xdfffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xe1000000, 0xe7ffffff, ResExcMemBlock); + RANGE(range, 0xe1000000, 0xe7ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xe9000000, 0xefffffff, ResExcMemBlock); + RANGE(range, 0xe9000000, 0xefffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xf1000000, 0xf7ffffff, ResExcMemBlock); + RANGE(range, 0xf1000000, 0xf7ffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xf9000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0xf9000000, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); } else { - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); } - RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -118,10 +129,10 @@ resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcIoBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -130,6 +141,14 @@ xf86AccResFromOS(resPtr ret) { resRange range; +#ifdef HAVE_DOMAINS + int domain = MIN_SYSTEM_DOMAIN; +#endif + +#ifdef HAVE_DOMAINS + if (ret != NULL) + domain = ret->res_domain; +#endif /* * Fallback is to claim the following areas: @@ -137,7 +156,7 @@ * 0x000c0000 - 0x000effff location of VGA and other extensions ROMS */ - RANGE(range, 0x000c0000, 0x000effff, ResExcMemBlock); + RANGE(range, 0x000c0000, 0x000effff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); /* @@ -145,20 +164,20 @@ * along with their sparse I/O aliases, but that's too imprecise. Instead * claim a bare minimum here. */ - RANGE(range, 0x00000000, 0x000000ff, ResExcIoBlock); /* For mainboard */ + RANGE(range, 0x00000000, 0x000000ff, ResExcIoBlock, domain); /* For mainboard */ ret = xf86AddResToList(ret, &range, -1); /* * At minimum, the top and bottom resources must be claimed, so that * resources that are (or appear to be) unallocated can be relocated. */ - RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock); + RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock); + RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); -/* RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock); +/* RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); */ - RANGE(range, 0xffffffff, 0xffffffff, ResExcIoBlock); + RANGE(range, 0xffffffff, 0xffffffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); /* XXX add others */ @@ -172,9 +191,18 @@ */ #ifdef __sparc__ +#ifndef HAVE_DOMAINS +#error This platform cannot operate correctly without HAVE_DOMAINS defined +#endif resRange PciAvoid[] = {_END}; +#define MIN_SYSTEM_DOMAIN 0 +#define MAX_SYSTEM_DOMAIN 255 +#define ISA_SYSTEM_DOMAIN 0 #else resRange PciAvoid[] = {_PCI_AVOID_PC_STYLE, _END}; +#define MIN_SYSTEM_DOMAIN 0 +#define MAX_SYSTEM_DOMAIN 0 +#define ISA_SYSTEM_DOMAIN 0 #endif resPtr @@ -182,32 +210,36 @@ { resPtr ret = NULL; resRange range; + int domain; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); - ret = xf86AddResToList(ret, &range, -1); + for (domain = MIN_SYSTEM_DOMAIN; domain <= MAX_SYSTEM_DOMAIN; domain++) { + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); + ret = xf86AddResToList(ret, &range, -1); #ifdef __sparc__ - RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock, domain); #else - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, domain); #endif - ret = xf86AddResToList(ret, &range, -1); + ret = xf86AddResToList(ret, &range, -1); + } + return ret; } resPtr -xf86PciBusAccWindowsFromOS(void) +xf86PciBusAccWindowsFromOS(int domain) { resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); #ifdef __sparc__ - RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock, domain); #else - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, domain); #endif ret = xf86AddResToList(ret, &range, -1); return ret; @@ -219,13 +251,13 @@ resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); #ifdef __sparc__ - RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock, ISA_SYSTEM_DOMAIN); #else - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, ISA_SYSTEM_DOMAIN); #endif ret = xf86AddResToList(ret, &range, -1); return ret; @@ -235,21 +267,29 @@ xf86AccResFromOS(resPtr ret) { resRange range; +#ifdef HAVE_DOMAINS + int domain = MIN_SYSTEM_DOMAIN; +#endif + +#ifdef HAVE_DOMAINS + if (ret != NULL) + domain = ret->res_domain; +#endif /* * At minimum, the top and bottom resources must be claimed, so that * resources that are (or appear to be) unallocated can be relocated. */ - RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock); + RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock); + RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock); + RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); #ifdef __sparc__ - RANGE(range, 0x00ffffff, 0x00ffffff, ResExcIoBlock); + RANGE(range, 0x00ffffff, 0x00ffffff, ResExcIoBlock, domain); #else - RANGE(range, 0x0000ffff, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x0000ffff, 0x0000ffff, ResExcIoBlock, domain); #endif ret = xf86AddResToList(ret, &range, -1); --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/shared/stdResource.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/shared/stdResource.c Sun Jun 3 19:44:48 2001 @@ -20,34 +20,42 @@ resRange PciAvoid[] = {_PCI_AVOID_PC_STYLE, _END}; #endif +#define MIN_SYSTEM_DOMAIN 0 +#define MAX_SYSTEM_DOMAIN 0 +#define ISA_SYSTEM_DOMAIN 0 + resPtr xf86StdBusAccWindowsFromOS(void) { /* Fallback is to allow addressing of all memory space */ resPtr ret = NULL; resRange range; + int domain; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); - ret = xf86AddResToList(ret, &range, -1); + for (domain = MIN_SYSTEM_DOMAIN; domain <= MAX_SYSTEM_DOMAIN; domain++) { + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + + /* Fallback is to allow addressing of all I/O space */ + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, domain); + ret = xf86AddResToList(ret, &range, -1); + } - /* Fallback is to allow addressing of all I/O space */ - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); - ret = xf86AddResToList(ret, &range, -1); return ret; } resPtr -xf86StdPciBusAccWindowsFromOS(void) +xf86StdPciBusAccWindowsFromOS(int domain) { /* Fallback is to allow addressing of all memory space */ resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); /* Fallback is to allow addressing of all I/O space */ - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -59,11 +67,11 @@ resPtr ret = NULL; resRange range; - RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); /* Fallback is to allow addressing of all I/O space */ - RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock, ISA_SYSTEM_DOMAIN); ret = xf86AddResToList(ret, &range, -1); return ret; } @@ -72,6 +80,14 @@ xf86StdAccResFromOS(resPtr ret) { resRange range; +#ifdef HAVE_DOMAINS + int domain = MIN_SYSTEM_DOMAIN; +#endif + +#ifdef HAVE_DOMAINS + if (ret != NULL) + domain = ret->res_domain; +#endif /* * Fallback is to claim the following areas: @@ -91,22 +107,22 @@ */ /* Fallback is to claim 0x0 - 0x9ffff and 0x100000 - 0x7fffffff */ - RANGE(range, 0x00000000, 0x0009ffff, ResExcMemBlock); + RANGE(range, 0x00000000, 0x0009ffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x000c0000, 0x000effff, ResExcMemBlock); + RANGE(range, 0x000c0000, 0x000effff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x000f0000, 0x000fffff, ResExcMemBlock); + RANGE(range, 0x000f0000, 0x000fffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); RANGE(range, 0x00100000, 0x3fffffff, - ResExcMemBlock | ResBios | ResEstimated); + ResExcMemBlock | ResBios | ResEstimated, domain); ret = xf86AddResToList(ret, &range, -1); #if 0 - RANGE(range, 0xfec00000, 0xfecfffff, ResExcMemBlock | ResBios); + RANGE(range, 0xfec00000, 0xfecfffff, ResExcMemBlock | ResBios, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xfee00000, 0xfeefffff, ResExcMemBlock | ResBios); + RANGE(range, 0xfee00000, 0xfeefffff, ResExcMemBlock | ResBios, domain); ret = xf86AddResToList(ret, &range, -1); #endif - RANGE(range, 0xffe00000, 0xffffffff, ResExcMemBlock | ResBios); + RANGE(range, 0xffe00000, 0xffffffff, ResExcMemBlock | ResBios, domain); ret = xf86AddResToList(ret, &range, -1); /* @@ -114,20 +130,20 @@ * along with their sparse I/O aliases, but that's too imprecise. Instead * claim a bare minimum here. */ - RANGE(range, 0x00000000, 0x000000ff, ResExcIoBlock); /* For mainboard */ + RANGE(range, 0x00000000, 0x000000ff, ResExcIoBlock, domain); /* For mainboard */ ret = xf86AddResToList(ret, &range, -1); /* * At minimum, the top and bottom resources must be claimed, so that * resources that are (or appear to be) unallocated can be relocated. */ -/* RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock); +/* RANGE(range, 0x00000000, 0x00000000, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock); + RANGE(range, 0xffffffff, 0xffffffff, ResExcMemBlock, domain); ret = xf86AddResToList(ret, &range, -1); - RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock); + RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); */ - RANGE(range, 0x0000ffff, 0x0000ffff, ResExcIoBlock); + RANGE(range, 0x0000ffff, 0x0000ffff, ResExcIoBlock, domain); ret = xf86AddResToList(ret, &range, -1); /* XXX add others */ --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/shared/vidmem.c.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/shared/vidmem.c Sun Jun 3 19:44:48 2001 @@ -135,6 +135,29 @@ } } +void +xf86MakeNewMapping(int ScreenNum, int Flags, unsigned long Base, unsigned long Size, pointer Vbase) +{ + VidMapPtr vp; + MappingPtr mp; + + vp = getVidMapRec(ScreenNum); + mp = newMapping(vp); + mp->physBase = Base; + mp->size = Size; + mp->virtBase = Vbase; + mp->flags = Flags; +} + +void +xf86InitVidMem(void) +{ + if (!vidMemInfo.initialised) { + memset(&vidMemInfo, 0, sizeof(VidMemInfo)); + xf86OSInitVidMem(&vidMemInfo); + } +} + pointer xf86MapVidMem(int ScreenNum, int Flags, unsigned long Base, unsigned long Size) { --- XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h.~1~ Sun Jun 3 19:44:41 2001 +++ XFree86-4.1.0/xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h Sun Jun 3 19:44:48 2001 @@ -137,6 +137,8 @@ /* public functions */ extern Bool xf86LinearVidMem(void); extern Bool xf86CheckMTRR(int); +extern void xf86MakeNewMapping(int, int, unsigned long, unsigned long, pointer); +extern void xf86InitVidMem(void); extern pointer xf86MapVidMem(int, int, unsigned long, unsigned long); extern void xf86UnMapVidMem(int, pointer, unsigned long); extern void xf86MapReadSideEffects(int, int, pointer, unsigned long); @@ -235,13 +237,13 @@ /* RAC-related privs */ /* internal to os-support layer */ resPtr xf86StdBusAccWindowsFromOS(void); -resPtr xf86StdPciAccWindowsFromOS(void); +resPtr xf86StdPciAccWindowsFromOS(int domain); resPtr xf86StdIsaAccWindowsFromOS(void); resPtr xf86StdAccResFromOS(resPtr ret); /* available to the common layer */ resPtr xf86BusAccWindowsFromOS(void); -resPtr xf86PciBusAccWindowsFromOS(void); +resPtr xf86PciBusAccWindowsFromOS(int domain); resPtr xf86IsaBusAccWindowsFromOS(void); resPtr xf86AccResFromOS(resPtr ret); #endif /* NEED_OS_RAC_PROTOS */