NV50: A few minor added safeties + cleanup.
authorMaarten Maathuis <madman2003@gmail.com>
Sun, 22 Jun 2008 16:47:51 +0000 (18:47 +0200)
committerMaarten Maathuis <madman2003@gmail.com>
Sun, 22 Jun 2008 16:47:51 +0000 (18:47 +0200)
linux-core/nouveau_bios.c
linux-core/nv50_crtc.c
linux-core/nv50_cursor.c
linux-core/nv50_dac.c
linux-core/nv50_display.c
linux-core/nv50_fb.c
linux-core/nv50_kms_wrapper.c
linux-core/nv50_kms_wrapper.h
linux-core/nv50_lut.c
linux-core/nv50_sor.c

index 8364741..3e7fe23 100644 (file)
@@ -532,6 +532,8 @@ int nouveau_parse_bios(struct drm_device *dev)
        int offset;
 
        dev_priv->bios.data = kzalloc(NV50_PROM__ESIZE, GFP_KERNEL);
+       if (!dev_priv->bios.data)
+               return -ENOMEM;
 
        if (!nv_shadow_bios(dev, dev_priv->bios.data))
                return -EINVAL;
index 974f520..f34e727 100644 (file)
@@ -463,6 +463,7 @@ int nv50_crtc_create(struct drm_device *dev, int index)
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nv50_crtc *crtc = NULL;
        struct nv50_display *display = NULL;
+       int rval = 0;
 
        NV50_DEBUG("\n");
 
@@ -476,8 +477,10 @@ int nv50_crtc_create(struct drm_device *dev, int index)
        crtc->dev = dev;
 
        display = nv50_get_display(dev);
-       if (!display)
+       if (!display) {
+               rval = -EINVAL;
                goto out;
+       }
 
        list_add_tail(&crtc->head, &display->crtcs);
 
@@ -486,6 +489,11 @@ int nv50_crtc_create(struct drm_device *dev, int index)
        crtc->mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
        crtc->native_mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
 
+       if (!crtc->mode || crtc->native_mode) {
+               rval = -ENOMEM;
+               goto out;
+       }
+
        nv50_fb_create(crtc);
        nv50_lut_create(crtc);
        nv50_cursor_create(crtc);
@@ -511,5 +519,5 @@ out:
        if (dev_priv->free_crtc)
                dev_priv->free_crtc(crtc);
 
-       return -EINVAL;
+       return rval;
 }
index 3d35b93..4196df6 100644 (file)
@@ -140,6 +140,8 @@ int nv50_cursor_create(struct nv50_crtc *crtc)
                return -EINVAL;
 
        crtc->cursor = kzalloc(sizeof(struct nv50_cursor), GFP_KERNEL);
+       if (!crtc->cursor)
+               return -ENOMEM;
 
        /* function pointers */
        crtc->cursor->show = nv50_cursor_show;
index f827fed..b237241 100644 (file)
@@ -122,6 +122,7 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
        struct nv50_output *output = NULL;
        struct nv50_display *display = NULL;
        struct dcb_entry *entry = NULL;
+       int rval = 0;
 
        NV50_DEBUG("\n");
 
@@ -135,12 +136,16 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
        output->dev = dev;
 
        display = nv50_get_display(dev);
-       if (!display)
+       if (!display) {
+               rval = -EINVAL;
                goto out;
+       }
 
        entry = &dev_priv->dcb_table.entry[dcb_entry];
-       if (!entry)
+       if (!entry) {
+               rval = -EINVAL;
                goto out;
+       }
 
        switch (entry->type) {
                case DCB_OUTPUT_ANALOG:
@@ -148,6 +153,7 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
                        DRM_INFO("Detected a DAC output\n");
                        break;
                default:
+                       rval = -EINVAL;
                        goto out;
        }
 
@@ -157,6 +163,10 @@ int nv50_dac_create(struct drm_device *dev, int dcb_entry)
        list_add_tail(&output->head, &display->outputs);
 
        output->native_mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
+       if (!output->native_mode) {
+               rval = -ENOMEM;
+               goto out;
+       }
 
        /* Set function pointers. */
        output->validate_mode = nv50_dac_validate_mode;
@@ -172,6 +182,6 @@ out:
                kfree(output->native_mode);
        if (dev_priv->free_output)
                dev_priv->free_output(output);
-       return -EINVAL;
+       return rval;
 }
 
index 56ddeb9..05ff72f 100644 (file)
@@ -189,6 +189,9 @@ int nv50_display_create(struct drm_device *dev)
 
        NV50_DEBUG("\n");
 
+       if (!display)
+               return -ENOMEM;
+
        INIT_LIST_HEAD(&display->crtcs);
        INIT_LIST_HEAD(&display->outputs);
        INIT_LIST_HEAD(&display->connectors);
index b44b48a..f57a9fa 100644 (file)
@@ -119,6 +119,9 @@ int nv50_fb_create(struct nv50_crtc *crtc)
 
        crtc->fb = kzalloc(sizeof(struct nv50_fb), GFP_KERNEL);
 
+       if (!crtc->fb)
+               return -ENOMEM;
+
        crtc->fb->bind = nv50_fb_bind;
 
        return 0;
index 01d4bc9..a63cb7d 100644 (file)
@@ -48,7 +48,10 @@ static void *nv50_kms_alloc_crtc(struct drm_device *dev)
        struct nv50_kms_priv *kms_priv = nv50_get_kms_priv(dev);
        struct nv50_kms_crtc *crtc = kzalloc(sizeof(struct nv50_kms_crtc), GFP_KERNEL);
 
-       list_add_tail(&crtc->head, &kms_priv->crtcs);
+       if (!crtc)
+               return NULL;
+
+       list_add_tail(&crtc->item, &kms_priv->crtcs);
 
        return &(crtc->priv);
 }
@@ -58,7 +61,10 @@ static void *nv50_kms_alloc_output(struct drm_device *dev)
        struct nv50_kms_priv *kms_priv = nv50_get_kms_priv(dev);
        struct nv50_kms_encoder *encoder = kzalloc(sizeof(struct nv50_kms_encoder), GFP_KERNEL);
 
-       list_add_tail(&encoder->head, &kms_priv->encoders);
+       if (!encoder)
+               return NULL;
+
+       list_add_tail(&encoder->item, &kms_priv->encoders);
 
        return &(encoder->priv);
 }
@@ -68,7 +74,10 @@ static void *nv50_kms_alloc_connector(struct drm_device *dev)
        struct nv50_kms_priv *kms_priv = nv50_get_kms_priv(dev);
        struct nv50_kms_connector *connector = kzalloc(sizeof(struct nv50_kms_connector), GFP_KERNEL);
 
-       list_add_tail(&connector->head, &kms_priv->connectors);
+       if (!connector)
+               return NULL;
+
+       list_add_tail(&connector->item, &kms_priv->connectors);
 
        return &(connector->priv);
 }
@@ -77,7 +86,7 @@ static void nv50_kms_free_crtc(void *crtc)
 {
        struct nv50_kms_crtc *kms_crtc = from_nv50_crtc(crtc);
 
-       list_del(&kms_crtc->head);
+       list_del(&kms_crtc->item);
 
        kfree(kms_crtc);
 }
@@ -86,7 +95,7 @@ static void nv50_kms_free_output(void *output)
 {
        struct nv50_kms_encoder *kms_encoder = from_nv50_output(output);
 
-       list_del(&kms_encoder->head);
+       list_del(&kms_encoder->item);
 
        kfree(kms_encoder);
 }
@@ -95,7 +104,7 @@ static void nv50_kms_free_connector(void *connector)
 {
        struct nv50_kms_connector *kms_connector = from_nv50_connector(connector);
 
-       list_del(&kms_connector->head);
+       list_del(&kms_connector->item);
 
        kfree(kms_connector);
 }
@@ -107,6 +116,8 @@ static void nv50_kms_free_connector(void *connector)
 static struct nouveau_hw_mode *nv50_kms_to_hw_mode(struct drm_display_mode *mode)
 {
        struct nouveau_hw_mode *hw_mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
+       if (!hw_mode)
+               return NULL;
 
        /* create hw values. */
        hw_mode->clock = mode->clock;
@@ -870,6 +881,9 @@ int nv50_kms_init(struct drm_device *dev)
        struct nv50_display *display = NULL;
        int rval = 0;
 
+       if (!kms_priv)
+               return -ENOMEM;
+
        dev_priv->kms_priv = kms_priv;
 
        /* function pointers */
index 3847d51..f224f1b 100644 (file)
 /* Link internal modesetting structure to interface. */
 
 struct nv50_kms_crtc {
-       struct list_head head;
+       struct list_head item;
 
        struct nv50_crtc priv;
        struct drm_crtc pub;
 };
 
 struct nv50_kms_encoder {
-       struct list_head head;
+       struct list_head item;
 
        struct nv50_output priv;
        struct drm_encoder pub;
 };
 
 struct nv50_kms_connector {
-       struct list_head head;
+       struct list_head item;
 
        struct nv50_connector priv;
        struct drm_connector pub;
index 570900b..cb52f27 100644 (file)
@@ -37,6 +37,9 @@ static int nv50_lut_alloc(struct nv50_crtc *crtc)
 
        NV50_DEBUG("\n");
 
+       if (!file_priv)
+               return -ENOMEM;
+
        /* Any file_priv should do as it's pointer is used as identification. */
        block = nouveau_mem_alloc(crtc->dev, 0, 4096, flags, file_priv);
 
@@ -137,6 +140,9 @@ int nv50_lut_create(struct nv50_crtc *crtc)
 
        crtc->lut = kzalloc(sizeof(struct nv50_lut), GFP_KERNEL);
 
+       if (!crtc->lut)
+               return -ENOMEM;
+
        rval = nv50_lut_alloc(crtc);
        if (rval != 0)
                return rval;
index 430c1e8..49f29fd 100644 (file)
@@ -138,6 +138,7 @@ int nv50_sor_create(struct drm_device *dev, int dcb_entry)
        struct nv50_output *output = NULL;
        struct nv50_display *display = NULL;
        struct dcb_entry *entry = NULL;
+       int rval = 0;
 
        NV50_DEBUG("\n");
 
@@ -151,12 +152,16 @@ int nv50_sor_create(struct drm_device *dev, int dcb_entry)
        output->dev = dev;
 
        display = nv50_get_display(dev);
-       if (!display)
+       if (!display) {
+               rval = -EINVAL;
                goto out;
+       }
 
        entry = &dev_priv->dcb_table.entry[dcb_entry];
-       if (!entry)
+       if (!entry) {
+               rval = -EINVAL;
                goto out;
+       }
 
        switch (entry->type) {
                case DCB_OUTPUT_TMDS:
@@ -168,6 +173,7 @@ int nv50_sor_create(struct drm_device *dev, int dcb_entry)
                        DRM_INFO("Detected a LVDS output\n");
                        break;
                default:
+                       rval = -EINVAL;
                        goto out;
        }
 
@@ -177,6 +183,10 @@ int nv50_sor_create(struct drm_device *dev, int dcb_entry)
        list_add_tail(&output->head, &display->outputs);
 
        output->native_mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
+       if (!output->native_mode) {
+               rval = -ENOMEM;
+               goto out;
+       }
 
        /* Set function pointers. */
        output->validate_mode = nv50_sor_validate_mode;
@@ -200,5 +210,5 @@ out:
                kfree(output->native_mode);
        if (dev_priv->free_output)
                dev_priv->free_output(output);
-       return -EINVAL;
+       return rval;
 }