drm/i915: build firmware handling code
authorFrançois Tigeot <ftigeot@wolfpond.org>
Tue, 29 Nov 2016 21:39:09 +0000 (22:39 +0100)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Tue, 29 Nov 2016 21:40:33 +0000 (22:40 +0100)
sys/dev/drm/i915/i915_dma.c
sys/dev/drm/i915/i915_gem.c
sys/dev/drm/i915/i915_guc_submission.c
sys/dev/drm/i915/intel_csr.c
sys/dev/drm/i915/intel_guc.h
sys/dev/drm/i915/intel_guc_loader.c
sys/dev/drm/i915/intel_lrc.c

index a7db681..efe06f4 100644 (file)
 
 #include <linux/async.h>
 #include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_legacy.h>
 #include "intel_drv.h"
 #include <drm/i915_drm.h>
-#include <drm/drm_legacy.h>
 #include "i915_drv.h"
 #include "i915_vgpu.h"
-#include "intel_ringbuffer.h"
-#include <linux/workqueue.h>
 
 
 static int i915_getparam(struct drm_device *dev, void *data,
@@ -392,12 +392,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
         * working irqs for e.g. gmbus and dp aux transfers. */
        intel_modeset_init(dev);
 
-       /* intel_guc_ucode_init() needs the mutex to allocate GEM objects */
-       mutex_lock(&dev->struct_mutex);
-#if 0
        intel_guc_ucode_init(dev);
-#endif
-       mutex_unlock(&dev->struct_mutex);
 
        ret = i915_gem_init(dev);
        if (ret)
@@ -858,7 +853,7 @@ static void intel_init_dpio(struct drm_i915_private *dev_priv)
  */
 int i915_driver_load(struct drm_device *dev, unsigned long flags)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv;
        struct intel_device_info *info, *device_info;
        int ret = 0, mmio_bar, mmio_size;
        uint32_t aperture_size;
@@ -1218,9 +1213,6 @@ int i915_driver_unload(struct drm_device *dev)
 #if 0
        if (dev_priv->regs != NULL)
                pci_iounmap(dev->pdev, dev_priv->regs);
-
-       if (dev_priv->slab)
-               kmem_cache_destroy(dev_priv->slab);
 #endif
 
        pci_dev_put(dev_priv->bridge_dev);
index 5b1f6ad..74cadd6 100644 (file)
@@ -4952,11 +4952,7 @@ i915_gem_init_hw(struct drm_device *dev)
 
        /* We can't enable contexts until all firmware is loaded */
        if (HAS_GUC_UCODE(dev)) {
-#ifndef __DragonFly__
                ret = intel_guc_ucode_load(dev);
-#else
-               ret = -ENOEXEC;
-#endif
                if (ret) {
                        /*
                         * If we got an error and GuC submission is enabled, map
@@ -5386,7 +5382,6 @@ bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj)
        return false;
 }
 
-#if 0
 /* Allocate a new GEM object and fill it with the supplied data */
 struct drm_i915_gem_object *
 i915_gem_object_create_from_data(struct drm_device *dev,
@@ -5411,7 +5406,7 @@ i915_gem_object_create_from_data(struct drm_device *dev,
 
        i915_gem_object_pin_pages(obj);
        sg = obj->pages;
-       bytes = sg_copy_from_buffer(sg->sgl, sg->nents, (void *)data, size);
+       bytes = sg_copy_from_buffer(sg->sgl, sg->nents, data, size);
        i915_gem_object_unpin_pages(obj);
 
        if (WARN_ON(bytes != size)) {
@@ -5426,4 +5421,3 @@ fail:
        drm_gem_object_unreference(&obj->base);
        return ERR_PTR(ret);
 }
-#endif
index 8b643a1..a2430b2 100644 (file)
@@ -22,6 +22,7 @@
  *
  */
 #include <linux/firmware.h>
+#include <linux/circ_buf.h>
 #include "i915_drv.h"
 #include "intel_guc.h"
 
@@ -74,7 +75,6 @@ static inline bool host2guc_action_response(struct drm_i915_private *dev_priv,
        return GUC2HOST_IS_RESPONSE(val);
 }
 
-#if 0
 static int host2guc_action(struct intel_guc *guc, u32 *data, u32 len)
 {
        struct drm_i915_private *dev_priv = guc_to_i915(guc);
@@ -86,7 +86,7 @@ static int host2guc_action(struct intel_guc *guc, u32 *data, u32 len)
                return -EINVAL;
 
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
-       spin_lock(&dev_priv->guc.host2guc_lock);
+       lockmgr(&dev_priv->guc.host2guc_lock, LK_EXCLUSIVE);
 
        dev_priv->guc.action_count += 1;
        dev_priv->guc.action_cmd = data[0];
@@ -119,7 +119,7 @@ static int host2guc_action(struct intel_guc *guc, u32 *data, u32 len)
        }
        dev_priv->guc.action_status = status;
 
-       spin_unlock(&dev_priv->guc.host2guc_lock);
+       lockmgr(&dev_priv->guc.host2guc_lock, LK_RELEASE);
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 
        return ret;
@@ -292,7 +292,7 @@ static uint32_t select_doorbell_cacheline(struct intel_guc *guc)
        const uint32_t cacheline_size = cache_line_size();
        uint32_t offset;
 
-       spin_lock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_EXCLUSIVE);
 
        /* Doorbell uses a single cache line within a page */
        offset = offset_in_page(guc->db_cacheline);
@@ -300,7 +300,7 @@ static uint32_t select_doorbell_cacheline(struct intel_guc *guc)
        /* Moving to next cache line to reduce contention */
        guc->db_cacheline += cacheline_size;
 
-       spin_unlock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_RELEASE);
 
        DRM_DEBUG_DRIVER("selected doorbell cacheline 0x%x, next 0x%x, linesize %u\n",
                        offset, guc->db_cacheline, cacheline_size);
@@ -322,13 +322,13 @@ static uint16_t assign_doorbell(struct intel_guc *guc, uint32_t priority)
        const uint16_t end = start + half;
        uint16_t id;
 
-       spin_lock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_EXCLUSIVE);
        id = find_next_zero_bit(guc->doorbell_bitmap, end, start);
        if (id == end)
                id = GUC_INVALID_DOORBELL_ID;
        else
                bitmap_set(guc->doorbell_bitmap, id, 1);
-       spin_unlock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_RELEASE);
 
        DRM_DEBUG_DRIVER("assigned %s priority doorbell id 0x%x\n",
                        hi_pri ? "high" : "normal", id);
@@ -338,9 +338,9 @@ static uint16_t assign_doorbell(struct intel_guc *guc, uint32_t priority)
 
 static void release_doorbell(struct intel_guc *guc, uint16_t id)
 {
-       spin_lock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_EXCLUSIVE);
        bitmap_clear(guc->doorbell_bitmap, id, 1);
-       spin_unlock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_RELEASE);
 }
 
 /*
@@ -490,7 +490,7 @@ static int guc_get_workqueue_space(struct i915_guc_client *gc, u32 *offset)
        int ret = 0, timeout_counter = 200;
 
        base = kmap_atomic(i915_gem_object_get_page(gc->client_obj, 0));
-       desc = base + gc->proc_desc_offset;
+       desc = (struct guc_process_desc *)((char *)base + gc->proc_desc_offset);
 
        while (timeout_counter-- > 0) {
                ret = wait_for_atomic(CIRC_SPACE(gc->wq_tail, desc->head,
@@ -570,7 +570,7 @@ static void lr_context_update(struct drm_i915_gem_request *rq)
        enum intel_ring_id ring_id = rq->ring->id;
        struct drm_i915_gem_object *ctx_obj = rq->ctx->engine[ring_id].state;
        struct drm_i915_gem_object *rb_obj = rq->ringbuf->obj;
-       struct page *page;
+       struct vm_page *page;
        uint32_t *reg_state;
 
        BUG_ON(!ctx_obj);
@@ -623,10 +623,10 @@ int i915_guc_submit(struct i915_guc_client *client,
        }
        spin_unlock_irqrestore(&client->wq_lock, flags);
 
-       spin_lock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_EXCLUSIVE);
        guc->submissions[ring_id] += 1;
        guc->last_seqno[ring_id] = rq->seqno;
-       spin_unlock(&guc->host2guc_lock);
+       lockmgr(&guc->host2guc_lock, LK_RELEASE);
 
        return q_ret;
 }
@@ -674,7 +674,6 @@ static struct drm_i915_gem_object *gem_allocate_guc_obj(struct drm_device *dev,
 
        return obj;
 }
-#endif
 
 /**
  * gem_release_guc_obj() - Release gem object allocated for GuC usage
@@ -691,7 +690,6 @@ static void gem_release_guc_obj(struct drm_i915_gem_object *obj)
        drm_gem_object_unreference(&obj->base);
 }
 
-#if 0
 static void guc_client_free(struct drm_device *dev,
                            struct i915_guc_client *client)
 {
@@ -770,7 +768,7 @@ static struct i915_guc_client *guc_client_alloc(struct drm_device *dev,
        client->client_obj = obj;
        client->wq_offset = GUC_DB_SIZE;
        client->wq_size = GUC_WQ_SIZE;
-       spin_lock_init(&client->wq_lock);
+       lockinit(&client->wq_lock, "i915cwql", 0, LK_CANRECURSE);
 
        client->doorbell_offset = select_doorbell_cacheline(guc);
 
@@ -873,7 +871,7 @@ int i915_guc_submission_init(struct drm_device *dev)
        if (!guc->ctx_pool_obj)
                return -ENOMEM;
 
-       spin_lock_init(&dev_priv->guc.host2guc_lock);
+       lockinit(&dev_priv->guc.host2guc_lock, "i915gh2g", 0, LK_CANRECURSE);
 
        ida_init(&guc->ctx_ids);
 
@@ -911,7 +909,6 @@ void i915_guc_submission_disable(struct drm_device *dev)
        guc_client_free(dev, guc->execbuf_client);
        guc->execbuf_client = NULL;
 }
-#endif
 
 void i915_guc_submission_fini(struct drm_device *dev)
 {
@@ -933,7 +930,6 @@ void i915_guc_submission_fini(struct drm_device *dev)
  */
 int intel_guc_suspend(struct drm_device *dev)
 {
-#if 0
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_guc *guc = &dev_priv->guc;
        struct intel_context *ctx;
@@ -951,7 +947,6 @@ int intel_guc_suspend(struct drm_device *dev)
        data[2] = i915_gem_obj_ggtt_offset(ctx->engine[RCS].state);
 
        return host2guc_action(guc, data, ARRAY_SIZE(data));
-#endif
        return -EIO;
 }
 
@@ -962,7 +957,6 @@ int intel_guc_suspend(struct drm_device *dev)
  */
 int intel_guc_resume(struct drm_device *dev)
 {
-#if 0
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_guc *guc = &dev_priv->guc;
        struct intel_context *ctx;
@@ -979,6 +973,5 @@ int intel_guc_resume(struct drm_device *dev)
        data[2] = i915_gem_obj_ggtt_offset(ctx->engine[RCS].state);
 
        return host2guc_action(guc, data, ARRAY_SIZE(data));
-#endif
        return -EIO;
 }
index 3f7469f..7a46962 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/firmware.h>
 #include "i915_drv.h"
 #include "i915_reg.h"
-#include "intel_drv.h"
 
 /**
  * DOC: csr support for dmc
@@ -184,7 +183,6 @@ static const struct stepping_info skl_stepping_info[] = {
                {'G', '0'}, {'H', '0'}, {'I', '0'}
 };
 
-#if 0
 static struct stepping_info bxt_stepping_info[] = {
        {'A', '0'}, {'A', '1'}, {'A', '2'},
        {'B', '0'}, {'B', '1'}, {'B', '2'}
@@ -213,7 +211,6 @@ static char intel_get_substepping(struct drm_device *dev)
        else
                return -ENODATA;
 }
-#endif
 
 /**
  * intel_csr_load_status_get() - to get firmware loading status.
@@ -291,14 +288,13 @@ void intel_csr_load_program(struct drm_device *dev)
        mutex_unlock(&dev_priv->csr_lock);
 }
 
-#if 0
 static void finish_csr_load(const struct firmware *fw, void *context)
 {
        struct drm_i915_private *dev_priv = context;
        struct drm_device *dev = dev_priv->dev;
-       struct intel_css_header *css_header;
-       struct intel_package_header *package_header;
-       struct intel_dmc_header *dmc_header;
+       const struct intel_css_header *css_header;
+       const struct intel_package_header *package_header;
+       const struct intel_dmc_header *dmc_header;
        struct intel_csr *csr = &dev_priv->csr;
        char stepping = intel_get_stepping(dev);
        char substepping = intel_get_substepping(dev);
@@ -318,7 +314,7 @@ static void finish_csr_load(const struct firmware *fw, void *context)
        }
 
        /* Extract CSS Header information*/
-       css_header = (struct intel_css_header *)fw->data;
+       css_header = (const struct intel_css_header *)fw->data;
        if (sizeof(struct intel_css_header) !=
                (css_header->header_len * 4)) {
                DRM_ERROR("Firmware has wrong CSS header length %u bytes\n",
@@ -328,7 +324,7 @@ static void finish_csr_load(const struct firmware *fw, void *context)
        readcount += sizeof(struct intel_css_header);
 
        /* Extract Package Header information*/
-       package_header = (struct intel_package_header *)
+       package_header = (const struct intel_package_header *)
                                        &fw->data[readcount];
        if (sizeof(struct intel_package_header) !=
                (package_header->header_len * 4)) {
@@ -359,7 +355,7 @@ static void finish_csr_load(const struct firmware *fw, void *context)
        readcount += dmc_offset;
 
        /* Extract dmc_header information. */
-       dmc_header = (struct intel_dmc_header *)&fw->data[readcount];
+       dmc_header = (const struct intel_dmc_header *)&fw->data[readcount];
        if (sizeof(struct intel_dmc_header) != (dmc_header->header_len)) {
                DRM_ERROR("Firmware has wrong dmc header length %u bytes\n",
                                (dmc_header->header_len));
@@ -415,7 +411,6 @@ out:
 
        release_firmware(fw);
 }
-#endif
 
 /**
  * intel_csr_ucode_init() - initialize the firmware loading.
@@ -426,7 +421,6 @@ out:
  */
 void intel_csr_ucode_init(struct drm_device *dev)
 {
-#if 0
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_csr *csr = &dev_priv->csr;
        int ret;
@@ -461,7 +455,6 @@ void intel_csr_ucode_init(struct drm_device *dev)
                i915_firmware_load_error_print(csr->fw_path, ret);
                intel_csr_load_status_set(dev_priv, FW_FAILED);
        }
-#endif
 }
 
 /**
@@ -473,7 +466,6 @@ void intel_csr_ucode_init(struct drm_device *dev)
  */
 void intel_csr_ucode_fini(struct drm_device *dev)
 {
-#if 0
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        if (!HAS_CSR(dev))
@@ -481,7 +473,6 @@ void intel_csr_ucode_fini(struct drm_device *dev)
 
        intel_csr_load_status_set(dev_priv, FW_FAILED);
        kfree(dev_priv->csr.dmc_payload);
-#endif
 }
 
 void assert_csr_loaded(struct drm_i915_private *dev_priv)
index 567b16e..434b5b5 100644 (file)
@@ -89,7 +89,7 @@ struct intel_guc {
 
        struct i915_guc_client *execbuf_client;
 
-       struct spinlock host2guc_lock;  /* Protects all data below      */
+       struct lock host2guc_lock;      /* Protects all data below      */
 
        DECLARE_BITMAP(doorbell_bitmap, GUC_MAX_DOORBELLS);
        uint32_t db_cacheline;          /* Cyclic counter mod pagesize  */
index e2a3bb1..8d9e13a 100644 (file)
@@ -96,7 +96,6 @@ static void direct_interrupts_to_host(struct drm_i915_private *dev_priv)
        I915_WRITE(GUC_WD_VECS_IER, 0);
 }
 
-#if 0
 static void direct_interrupts_to_guc(struct drm_i915_private *dev_priv)
 {
        struct intel_engine_cs *ring;
@@ -186,7 +185,6 @@ static void set_guc_init_params(struct drm_i915_private *dev_priv)
        for (i = 0; i < GUC_CTL_MAX_DWORDS; i++)
                I915_WRITE(SOFT_SCRATCH(1 + i), params[i]);
 }
-#endif
 
 /*
  * Read the GuC status register (GUC_STATUS) and store it in the
@@ -234,7 +232,6 @@ static inline bool guc_ucode_response(struct drm_i915_private *dev_priv,
 #define UOS_CSS_HEADER_SIZE            0x80
 #define UOS_RSA_SIG_SIZE               0x100
 
-#if 0
 static int guc_ucode_xfer_dma(struct drm_i915_private *dev_priv)
 {
        struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
@@ -459,7 +456,7 @@ fail:
 static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
 {
        struct drm_i915_gem_object *obj;
-       const struct firmware *fw;
+       const struct firmware *fw = NULL;
        const u8 *css_header;
        const size_t minsize = UOS_CSS_HEADER_SIZE + UOS_RSA_SIG_SIZE;
        const size_t maxsize = GUC_WOPCM_SIZE_VALUE + UOS_RSA_SIG_SIZE
@@ -478,10 +475,10 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
        DRM_DEBUG_DRIVER("fetch GuC fw from %s succeeded, fw %p\n",
                guc_fw->guc_fw_path, fw);
        DRM_DEBUG_DRIVER("firmware file size %zu (minimum %zu, maximum %zu)\n",
-               fw->size, minsize, maxsize);
+               fw->datasize, minsize, maxsize);
 
        /* Check the size of the blob befoe examining buffer contents */
-       if (fw->size < minsize || fw->size > maxsize)
+       if (fw->datasize < minsize || fw->datasize > maxsize)
                goto fail;
 
        /*
@@ -490,9 +487,9 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
         * TWO bytes each (i.e. u16), although all pointers and offsets are defined
         * in terms of bytes (u8).
         */
-       css_header = fw->data + UOS_CSS_HEADER_OFFSET;
-       guc_fw->guc_fw_major_found = *(u16 *)(css_header + UOS_VER_MAJOR_OFFSET);
-       guc_fw->guc_fw_minor_found = *(u16 *)(css_header + UOS_VER_MINOR_OFFSET);
+       css_header = (const uint8_t *)fw->data + UOS_CSS_HEADER_OFFSET;
+       guc_fw->guc_fw_major_found = *(const u16 *)(css_header + UOS_VER_MAJOR_OFFSET);
+       guc_fw->guc_fw_minor_found = *(const u16 *)(css_header + UOS_VER_MINOR_OFFSET);
 
        if (guc_fw->guc_fw_major_found != guc_fw->guc_fw_major_wanted ||
            guc_fw->guc_fw_minor_found < guc_fw->guc_fw_minor_wanted) {
@@ -508,7 +505,7 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
                        guc_fw->guc_fw_major_wanted, guc_fw->guc_fw_minor_wanted);
 
        mutex_lock(&dev->struct_mutex);
-       obj = i915_gem_object_create_from_data(dev, fw->data, fw->size);
+       obj = i915_gem_object_create_from_data(dev, fw->data, fw->datasize);
        mutex_unlock(&dev->struct_mutex);
        if (IS_ERR_OR_NULL(obj)) {
                err = obj ? PTR_ERR(obj) : -ENOMEM;
@@ -516,7 +513,7 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
        }
 
        guc_fw->guc_fw_obj = obj;
-       guc_fw->guc_fw_size = fw->size;
+       guc_fw->guc_fw_size = fw->datasize;
 
        DRM_DEBUG_DRIVER("GuC fw fetch status SUCCESS, obj %p\n",
                        guc_fw->guc_fw_obj);
@@ -588,7 +585,6 @@ void intel_guc_ucode_init(struct drm_device *dev)
        guc_fw_fetch(dev, guc_fw);
        /* status must now be FAIL or SUCCESS */
 }
-#endif
 
 /**
  * intel_guc_ucode_fini() - clean up all allocated resources
index 32288d1..a917c17 100644 (file)
@@ -724,6 +724,7 @@ static void
 intel_logical_ring_advance_and_submit(struct drm_i915_gem_request *request)
 {
        struct intel_engine_cs *ring = request->ring;
+       struct drm_i915_private *dev_priv = request->i915;
 
        intel_logical_ring_advance(request->ringbuf);
 
@@ -732,11 +733,9 @@ intel_logical_ring_advance_and_submit(struct drm_i915_gem_request *request)
        if (intel_ring_stopped(ring))
                return;
 
-#if 0
        if (dev_priv->guc.execbuf_client)
                i915_guc_submit(dev_priv->guc.execbuf_client, request);
        else
-#endif
                execlists_context_queue(request);
 }