19d4fa1a1SMauro Carvalho Chehab /* 29d4fa1a1SMauro Carvalho Chehab * Support for Intel Camera Imaging ISP subsystem. 39d4fa1a1SMauro Carvalho Chehab * Copyright (c) 2015, Intel Corporation. 49d4fa1a1SMauro Carvalho Chehab * 59d4fa1a1SMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify it 69d4fa1a1SMauro Carvalho Chehab * under the terms and conditions of the GNU General Public License, 79d4fa1a1SMauro Carvalho Chehab * version 2, as published by the Free Software Foundation. 89d4fa1a1SMauro Carvalho Chehab * 99d4fa1a1SMauro Carvalho Chehab * This program is distributed in the hope it will be useful, but WITHOUT 109d4fa1a1SMauro Carvalho Chehab * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 119d4fa1a1SMauro Carvalho Chehab * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 129d4fa1a1SMauro Carvalho Chehab * more details. 139d4fa1a1SMauro Carvalho Chehab */ 149d4fa1a1SMauro Carvalho Chehab 159d4fa1a1SMauro Carvalho Chehab #ifndef __ASSERT_SUPPORT_H_INCLUDED__ 169d4fa1a1SMauro Carvalho Chehab #define __ASSERT_SUPPORT_H_INCLUDED__ 179d4fa1a1SMauro Carvalho Chehab 189d4fa1a1SMauro Carvalho Chehab /** 199d4fa1a1SMauro Carvalho Chehab * The following macro can help to test the size of a struct at compile 209d4fa1a1SMauro Carvalho Chehab * time rather than at run-time. It does not work for all compilers; see 219d4fa1a1SMauro Carvalho Chehab * below. 229d4fa1a1SMauro Carvalho Chehab * 239d4fa1a1SMauro Carvalho Chehab * Depending on the value of 'condition', the following macro is expanded to: 249d4fa1a1SMauro Carvalho Chehab * - condition==true: 259d4fa1a1SMauro Carvalho Chehab * an expression containing an array declaration with negative size, 269d4fa1a1SMauro Carvalho Chehab * usually resulting in a compilation error 279d4fa1a1SMauro Carvalho Chehab * - condition==false: 289d4fa1a1SMauro Carvalho Chehab * (void) 1; // C statement with no effect 299d4fa1a1SMauro Carvalho Chehab * 309d4fa1a1SMauro Carvalho Chehab * example: 319d4fa1a1SMauro Carvalho Chehab * COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) != SIZE_OF_HOST_SP_QUEUES_STRUCT); 329d4fa1a1SMauro Carvalho Chehab * 339d4fa1a1SMauro Carvalho Chehab * verify that the macro indeed triggers a compilation error with your compiler: 349d4fa1a1SMauro Carvalho Chehab * COMPILATION_ERROR_IF( sizeof(struct host_sp_queues) != (sizeof(struct host_sp_queues)+1) ); 359d4fa1a1SMauro Carvalho Chehab * 369d4fa1a1SMauro Carvalho Chehab * Not all compilers will trigger an error with this macro; use a search engine to search for 379d4fa1a1SMauro Carvalho Chehab * BUILD_BUG_ON to find other methods. 389d4fa1a1SMauro Carvalho Chehab */ 399d4fa1a1SMauro Carvalho Chehab #define COMPILATION_ERROR_IF(condition) ((void)sizeof(char[1 - 2 * !!(condition)])) 409d4fa1a1SMauro Carvalho Chehab 419d4fa1a1SMauro Carvalho Chehab /* Compile time assertion */ 429d4fa1a1SMauro Carvalho Chehab #ifndef CT_ASSERT 439d4fa1a1SMauro Carvalho Chehab #define CT_ASSERT(cnd) ((void)sizeof(char[(cnd) ? 1 : -1])) 449d4fa1a1SMauro Carvalho Chehab #endif /* CT_ASSERT */ 459d4fa1a1SMauro Carvalho Chehab 469d4fa1a1SMauro Carvalho Chehab #include <linux/bug.h> 479d4fa1a1SMauro Carvalho Chehab 489d4fa1a1SMauro Carvalho Chehab /* TODO: it would be cleaner to use this: 499d4fa1a1SMauro Carvalho Chehab * #define assert(cnd) BUG_ON(cnd) 509d4fa1a1SMauro Carvalho Chehab * but that causes many compiler warnings (==errors) under Android 519d4fa1a1SMauro Carvalho Chehab * because it seems that the BUG_ON() macro is not seen as a check by 529d4fa1a1SMauro Carvalho Chehab * gcc like the BUG() macro is. */ 539d4fa1a1SMauro Carvalho Chehab #define assert(cnd) \ 549d4fa1a1SMauro Carvalho Chehab do { \ 559d4fa1a1SMauro Carvalho Chehab if (!(cnd)) \ 569d4fa1a1SMauro Carvalho Chehab BUG(); \ 579d4fa1a1SMauro Carvalho Chehab } while (0) 589d4fa1a1SMauro Carvalho Chehab 599d4fa1a1SMauro Carvalho Chehab #ifndef PIPE_GENERATION 609d4fa1a1SMauro Carvalho Chehab /* Deprecated OP___assert, this is still used in ~1000 places 619d4fa1a1SMauro Carvalho Chehab * in the code. This will be removed over time. 629d4fa1a1SMauro Carvalho Chehab * The implementation for the pipe generation tool is in see support.isp.h */ 639d4fa1a1SMauro Carvalho Chehab #define OP___assert(cnd) assert(cnd) 649d4fa1a1SMauro Carvalho Chehab 659d4fa1a1SMauro Carvalho Chehab static inline void compile_time_assert(unsigned int cond) 669d4fa1a1SMauro Carvalho Chehab { 679d4fa1a1SMauro Carvalho Chehab /* Call undefined function if cond is false */ 689d4fa1a1SMauro Carvalho Chehab void _compile_time_assert(void); 699d4fa1a1SMauro Carvalho Chehab if (!cond) _compile_time_assert(); 709d4fa1a1SMauro Carvalho Chehab } 719d4fa1a1SMauro Carvalho Chehab #endif /* PIPE_GENERATION */ 729d4fa1a1SMauro Carvalho Chehab 739d4fa1a1SMauro Carvalho Chehab #endif /* __ASSERT_SUPPORT_H_INCLUDED__ */ 74