Skip to contentSkip to conversation

ati_radeon: Support PCI virtual not eq bus mapping.

PATCH Superseded Ed Swarthout 2 participants 4 messages Mar 31, 2010 – Apr 8, 2010 Framebuffer layer

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ati_radeon: Support PCI virtual not eq bus mapping.

Use pci_bus_to_virt() to convert the bus address from the BARs to virtual address' to eliminate the direct mapping requirement.

Rename variables to better match usage (_phys -> _bus or no-suffix)

This fixes the mpc8572ds CONFIG_PYS_64BIT mode failure:
"videoboot: Vidoe ROM failed to map!"

Tested on mpc8572ds with and without CONFIG_PHYS_64BIT.

---

This patch is independent of the ati radeon return error patch, but for ease of debug it should be applied with this one.

 drivers/bios_emulator/atibios.c |    9 ++++---
 drivers/video/ati_radeon_fb.c   |   45 ++++++++++++++++++++------------------
 drivers/video/ati_radeon_fb.h   |    4 +-
 3 files changed, 31 insertions(+), 27 deletions(-)
drivers/bios_emulator/atibios.c +5 -4
index 2881449..f488259 100644
@@ -173,7 +173,7 @@ Maps a pointer to the BIOS image on the graphics card on the PCI bus.
 ****************************************************************************/
 void *PCI_mapBIOSImage(pci_dev_t pcidev)
 {
-	u32 BIOSImagePhys;
+	u32 BIOSImageBus;
 	int BIOSImageBAR;
 	u8 *BIOSImage;
 
@@ -195,16 +195,17 @@ void *PCI_mapBIOSImage(pci_dev_t pcidev)
 	 specific programming for different cards to solve this problem.
 	*/
 
-	if ((BIOSImagePhys = PCI_findBIOSAddr(pcidev, &BIOSImageBAR)) == 0) {
+	if ((BIOSImageBus = PCI_findBIOSAddr(pcidev, &BIOSImageBAR)) == 0) {
 		printf("Find bios addr error\n");
 		return NULL;
 	}
 
-	BIOSImage = (u8 *) BIOSImagePhys;
+	BIOSImage = pci_bus_to_virt(pcidev, BIOSImageBus,
+				    PCI_REGION_MEM, 0, MAP_NOCACHE);
 
 	/*Change the PCI BAR registers to map it onto the bus.*/
 	pci_write_config_dword(pcidev, BIOSImageBAR, 0);
-	pci_write_config_dword(pcidev, PCI_ROM_ADDRESS, BIOSImagePhys | 0x1);
+	pci_write_config_dword(pcidev, PCI_ROM_ADDRESS, BIOSImageBus | 0x1);
 
 	udelay(1);
 
drivers/video/ati_radeon_fb.c +24 -21

80 lines not on this page · raw message

drivers/video/ati_radeon_fb.h +2 -2
index e981f95..0659045 100644
@@ -49,8 +49,8 @@ struct radeonfb_info {
 	struct pci_device_id	pdev;
 	u16			family;
 
-	u32			fb_base_phys;
-	u32			mmio_base_phys;
+	u32			fb_base_bus;
+	u32			mmio_base_bus;
 
 	void			*mmio_base;
 	void			*fb_base;
Signature · 1 line
1.5.6.5
#1 lore raw

PATCH 1/1 ati_radeon: Support PCI virtual not eq bus mapping.

Quoted 7 lines · On Wed, 31 Mar 2010 09:54:57 -0500 Ed Swarthout <[email protected]>…

Use pci_bus_to_virt() to convert the bus address from the BARs to virtual address' to eliminate the direct mapping requirement.

Rename variables to better match usage (_phys -> _bus or no-suffix)

This fixes the mpc8572ds CONFIG_PYS_64BIT mode failure:
"videoboot: Vidoe ROM failed to map!"

s/CONFIG_PYS_64BIT/CONFIG_PHYS_64BIT
s/Vidoe/Video

Quoted 5 lines

Tested on mpc8572ds with and without CONFIG_PHYS_64BIT.

---

Quoted 7 lines

This patch is independent of the ati radeon return error patch, but for ease of debug it should be applied with this one.

 drivers/bios_emulator/atibios.c |    9 ++++---
 drivers/video/ati_radeon_fb.c   |   45 ++++++++++++++++++++------------------
 drivers/video/ati_radeon_fb.h   |    4 +-
 3 files changed, 31 insertions(+), 27 deletions(-)

With this patch applied following warnings appear:

ati_radeon_fb.c: In function 'video_hw_init':
ati_radeon_fb.c:740: warning: assignment makes integer from pointer without a cast ati_radeon_fb.c:741: warning: assignment makes integer from pointer without a cast ati_radeon_fb.c:746: warning: assignment makes integer from pointer without a cast ati_radeon_fb.c:754: warning: assignment makes integer from pointer without a cast ati_radeon_fb.c:755: warning: assignment makes integer from pointer without a cast

Please include inlined patch below to fix them. Thanks.

Other than this, I tested this patch on PPC440EPx based sequoia board with ATI Radeon 9250 PCI card, it works.

Anatolij

drivers/video/ati_radeon_fb.c +6 -6
index a74f724..c2c2096 100644
@@ -737,13 +737,13 @@ void *video_hw_init(void)
 	}
 
 	pGD->isaBase = CONFIG_SYS_ISA_IO_BASE_ADDRESS;
-	pGD->pciBase = rinfo->fb_base;
-	pGD->frameAdrs = rinfo->fb_base;
+	pGD->pciBase = (unsigned int)rinfo->fb_base;
+	pGD->frameAdrs = (unsigned int)rinfo->fb_base;
 	pGD->memSize = 64 * 1024 * 1024;
 
 	/* Cursor Start Address */
-	pGD->dprBase =
-	    (pGD->winSizeX * pGD->winSizeY * pGD->gdfBytesPP) + rinfo->fb_base;
+	pGD->dprBase = (pGD->winSizeX * pGD->winSizeY * pGD->gdfBytesPP) +
+		       (unsigned int)rinfo->fb_base;
 	if ((pGD->dprBase & 0x0fff) != 0) {
 		/* allign it */
 		pGD->dprBase &= 0xfffff000;
@@ -751,8 +751,8 @@ void *video_hw_init(void)
 	}
 	DPRINT ("Cursor Start %x Pattern Start %x\n", pGD->dprBase,
 		PATTERN_ADR);
-	pGD->vprBase = rinfo->fb_base;	/* Dummy */
-	pGD->cprBase = rinfo->fb_base;	/* Dummy */
+	pGD->vprBase = (unsigned int)rinfo->fb_base;	/* Dummy */
+	pGD->cprBase = (unsigned int)rinfo->fb_base;	/* Dummy */
 	/* set up Hardware */
 
 	/* Clear video memory (only visible screen area) */
#2 lore raw

PATCH v2 1/1 ati_radeon: Support PCI virtual not eq bus mapping.

Use pci_bus_to_virt() to convert the bus address from the BARs to virtual address' to eliminate the direct mapping requirement.

Rename variables to better match usage (_phys -> _bus or no-suffix)

This fixes the mpc8572ds CONFIG_PHYS_64BIT mode failure:
"videoboot: Video ROM failed to map!"

Tested on mpc8572ds with and without CONFIG_PHYS_64BIT.

---

V2:

Fix typos and warnings as pointed out by Anatolij Gustschin. -thanks

Fixed checkpatch error:

ERROR: do not use assignment in if condition
#41: FILE: drivers/bios_emulator/atibios.c:198:
+ if ((BIOSImageBus = PCI_findBIOSAddr(pcidev, &BIOSImageBAR)) == 0) {

 drivers/bios_emulator/atibios.c |   10 +++++---
 drivers/video/ati_radeon_fb.c   |   47 ++++++++++++++++++++------------------
 drivers/video/ati_radeon_fb.h   |    4 +-
 3 files changed, 33 insertions(+), 28 deletions(-)
drivers/bios_emulator/atibios.c +6 -4
index 2881449..dbb5e8c 100644
@@ -173,7 +173,7 @@ Maps a pointer to the BIOS image on the graphics card on the PCI bus.
 ****************************************************************************/
 void *PCI_mapBIOSImage(pci_dev_t pcidev)
 {
-	u32 BIOSImagePhys;
+	u32 BIOSImageBus;
 	int BIOSImageBAR;
 	u8 *BIOSImage;
 
@@ -195,16 +195,18 @@ void *PCI_mapBIOSImage(pci_dev_t pcidev)
 	 specific programming for different cards to solve this problem.
 	*/
 
-	if ((BIOSImagePhys = PCI_findBIOSAddr(pcidev, &BIOSImageBAR)) == 0) {
+	BIOSImageBus = PCI_findBIOSAddr(pcidev, &BIOSImageBAR);
+	if (BIOSImageBus == 0) {
 		printf("Find bios addr error\n");
 		return NULL;
 	}
 
-	BIOSImage = (u8 *) BIOSImagePhys;
+	BIOSImage = pci_bus_to_virt(pcidev, BIOSImageBus,
+				    PCI_REGION_MEM, 0, MAP_NOCACHE);
 
 	/*Change the PCI BAR registers to map it onto the bus.*/
 	pci_write_config_dword(pcidev, BIOSImageBAR, 0);
-	pci_write_config_dword(pcidev, PCI_ROM_ADDRESS, BIOSImagePhys | 0x1);
+	pci_write_config_dword(pcidev, PCI_ROM_ADDRESS, BIOSImageBus | 0x1);
 
 	udelay(1);
 
drivers/video/ati_radeon_fb.c +25 -22

81 lines not on this page · raw message

drivers/video/ati_radeon_fb.h +2 -2
index e981f95..0659045 100644
@@ -49,8 +49,8 @@ struct radeonfb_info {
 	struct pci_device_id	pdev;
 	u16			family;
 
-	u32			fb_base_phys;
-	u32			mmio_base_phys;
+	u32			fb_base_bus;
+	u32			mmio_base_bus;
 
 	void			*mmio_base;
 	void			*fb_base;
Signature · 1 line
1.5.6.5
#3 lore raw

PATCH v2 1/1 ati_radeon: Support PCI virtual not eq bus mapping.

Quoted 19 lines · On Wed, 31 Mar 2010 15:52:40 -0500 Ed Swarthout <[email protected]>…

Use pci_bus_to_virt() to convert the bus address from the BARs to virtual address' to eliminate the direct mapping requirement.

Rename variables to better match usage (_phys -> _bus or no-suffix)

This fixes the mpc8572ds CONFIG_PHYS_64BIT mode failure:
"videoboot: Video ROM failed to map!"

Tested on mpc8572ds with and without CONFIG_PHYS_64BIT.

---

V2:

Fix typos and warnings as pointed out by Anatolij Gustschin. -thanks

Fixed checkpatch error:

Quoted 8 lines

ERROR: do not use assignment in if condition
#41: FILE: drivers/bios_emulator/atibios.c:198:
+ if ((BIOSImageBus = PCI_findBIOSAddr(pcidev, &BIOSImageBAR)) == 0) {

 drivers/bios_emulator/atibios.c |   10 +++++---
 drivers/video/ati_radeon_fb.c   |   47 ++++++++++++++++++++------------------
 drivers/video/ati_radeon_fb.h   |    4 +-
 3 files changed, 33 insertions(+), 28 deletions(-)

Applied to u-boot-video/master. Thanks!

Anatolij