aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2005-05-22 04:36:33 +0000
committerIan Romanick <idr@us.ibm.com>2005-05-22 04:36:33 +0000
commit955791f0645d4b61bd20d817c532dda3a40aaddd (patch)
tree0bbe4af4013db83d8a952d05691c9b17bdb9c6c6
parent75cb43ccd73dd2c8c196d209862b8a3ea4e433cb (diff)
Refactor the routines for "calculating" the size of the WARP microcode. The
two routines (one for G200 and one for G400) were replaced with static const variables and a single function that returns the correct size. The code to generate an error if the allocated WARP region is too small was refactored from mga_warp_install_{g200,g400}_microcode to mga_wrap_install_microcode. mga_warp_microcode_size is global to the MGA DRM because it will soon be used by code in another file.
-rw-r--r--shared-core/mga_drv.h1
-rw-r--r--shared-core/mga_warp.c58
2 files changed, 24 insertions, 35 deletions
diff --git a/shared-core/mga_drv.h b/shared-core/mga_drv.h
index 86dedbe8..e12dbd42 100644
--- a/shared-core/mga_drv.h
+++ b/shared-core/mga_drv.h
@@ -130,6 +130,7 @@ extern void mga_do_dma_wrap_end(drm_mga_private_t * dev_priv);
extern int mga_freelist_put(drm_device_t * dev, drm_buf_t * buf);
/* mga_warp.c */
+extern unsigned int mga_warp_microcode_size(const drm_mga_private_t * dev_priv);
extern int mga_warp_install_microcode(drm_mga_private_t * dev_priv);
extern int mga_warp_init(drm_mga_private_t * dev_priv);
diff --git a/shared-core/mga_warp.c b/shared-core/mga_warp.c
index a5d35911..b8fe48d1 100644
--- a/shared-core/mga_warp.c
+++ b/shared-core/mga_warp.c
@@ -47,11 +47,8 @@ do { \
vcbase += WARP_UCODE_SIZE( which ); \
} while (0)
-static unsigned int mga_warp_g400_microcode_size(drm_mga_private_t * dev_priv)
-{
- unsigned int size;
-
- size = (WARP_UCODE_SIZE(warp_g400_tgz) +
+static const unsigned int mga_warp_g400_microcode_size =
+ (WARP_UCODE_SIZE(warp_g400_tgz) +
WARP_UCODE_SIZE(warp_g400_tgza) +
WARP_UCODE_SIZE(warp_g400_tgzaf) +
WARP_UCODE_SIZE(warp_g400_tgzf) +
@@ -68,17 +65,8 @@ static unsigned int mga_warp_g400_microcode_size(drm_mga_private_t * dev_priv)
WARP_UCODE_SIZE(warp_g400_t2gzsaf) +
WARP_UCODE_SIZE(warp_g400_t2gzsf));
- size = PAGE_ALIGN(size);
-
- DRM_DEBUG("G400 ucode size = %d bytes\n", size);
- return size;
-}
-
-static unsigned int mga_warp_g200_microcode_size(drm_mga_private_t * dev_priv)
-{
- unsigned int size;
-
- size = (WARP_UCODE_SIZE(warp_g200_tgz) +
+static const unsigned int mga_warp_g200_microcode_size =
+ (WARP_UCODE_SIZE(warp_g200_tgz) +
WARP_UCODE_SIZE(warp_g200_tgza) +
WARP_UCODE_SIZE(warp_g200_tgzaf) +
WARP_UCODE_SIZE(warp_g200_tgzf) +
@@ -87,24 +75,23 @@ static unsigned int mga_warp_g200_microcode_size(drm_mga_private_t * dev_priv)
WARP_UCODE_SIZE(warp_g200_tgzsaf) +
WARP_UCODE_SIZE(warp_g200_tgzsf));
- size = PAGE_ALIGN(size);
- DRM_DEBUG("G200 ucode size = %d bytes\n", size);
- return size;
+unsigned int mga_warp_microcode_size(const drm_mga_private_t * dev_priv)
+{
+ switch (dev_priv->chipset) {
+ case MGA_CARD_TYPE_G400:
+ return PAGE_ALIGN(mga_warp_g400_microcode_size);
+ case MGA_CARD_TYPE_G200:
+ return PAGE_ALIGN(mga_warp_g200_microcode_size);
+ default:
+ return 0;
+ }
}
static int mga_warp_install_g400_microcode(drm_mga_private_t * dev_priv)
{
unsigned char *vcbase = dev_priv->warp->handle;
unsigned long pcbase = dev_priv->warp->offset;
- unsigned int size;
-
- size = mga_warp_g400_microcode_size(dev_priv);
- if (size > dev_priv->warp->size) {
- DRM_ERROR("microcode too large! (%u > %lu)\n",
- size, dev_priv->warp->size);
- return DRM_ERR(ENOMEM);
- }
memset(dev_priv->warp_pipe_phys, 0, sizeof(dev_priv->warp_pipe_phys));
@@ -133,14 +120,6 @@ static int mga_warp_install_g200_microcode(drm_mga_private_t * dev_priv)
{
unsigned char *vcbase = dev_priv->warp->handle;
unsigned long pcbase = dev_priv->warp->offset;
- unsigned int size;
-
- size = mga_warp_g200_microcode_size(dev_priv);
- if (size > dev_priv->warp->size) {
- DRM_ERROR("microcode too large! (%u > %lu)\n",
- size, dev_priv->warp->size);
- return DRM_ERR(ENOMEM);
- }
memset(dev_priv->warp_pipe_phys, 0, sizeof(dev_priv->warp_pipe_phys));
@@ -158,6 +137,15 @@ static int mga_warp_install_g200_microcode(drm_mga_private_t * dev_priv)
int mga_warp_install_microcode(drm_mga_private_t * dev_priv)
{
+ const unsigned int size = mga_warp_microcode_size(dev_priv);
+
+ DRM_DEBUG("MGA ucode size = %d bytes\n", size);
+ if (size > dev_priv->warp->size) {
+ DRM_ERROR("microcode too large! (%u > %lu)\n",
+ size, dev_priv->warp->size);
+ return DRM_ERR(ENOMEM);
+ }
+
switch (dev_priv->chipset) {
case MGA_CARD_TYPE_G400:
return mga_warp_install_g400_microcode(dev_priv);